From e511d4d0d974d0f59e34295c1569a37b24ad38cf Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Sun, 5 May 2019 10:01:07 +0800 Subject: [PATCH 1/3] - Enhancement: ESM distribution and point to source via `package.json` `module` (Note: not ignoring dist as can more easily flag changes or need for changes) - Refactoring: ESM in source (removing now redundant `use strict`); change Bezier functions to individual exports - npm: Add `rollup` script; add it to test script --- .babelrc | 8 + .eslintignore | 2 + .eslintrc.js | 39 +- .npmignore | 1 + dist/index-esm.js | 4098 +++++++++++++++++++++++++ dist/index-esm.min.js | 2 + dist/index-esm.min.js.map | 1 + dist/index-umd.js | 4115 ++++++++++++++++++++++++++ dist/index-umd.min.js | 2 + dist/index-umd.min.js.map | 1 + examples/PathHandler.js | 11 +- examples/example-1.js | 6 +- examples/example-2.js | 6 +- examples/example-3.js | 4 +- examples/path-line.js | 9 +- examples/rotate-rectangle-line.js | 4 +- examples/rotated-ellipse-line.js | 6 +- examples/tessellate-cubic-beziers.js | 6 +- index.js | 16 +- lib/AffineShapes.js | 12 +- lib/Intersection.js | 13 +- lib/IntersectionArgs.js | 6 +- lib/IntersectionQuery.js | 11 +- lib/Shapes.js | 14 +- package-lock.json | 2437 ++++++++++++++- package.json | 18 +- rollup.config.js | 50 + test/cubic-cubic-fail.js | 8 +- test/find_parameters.js | 6 +- test/intersection_tests.js | 6 +- 30 files changed, 10765 insertions(+), 153 deletions(-) create mode 100644 .babelrc create mode 100644 dist/index-esm.js create mode 100644 dist/index-esm.min.js create mode 100644 dist/index-esm.min.js.map create mode 100644 dist/index-umd.js create mode 100644 dist/index-umd.min.js create mode 100644 dist/index-umd.min.js.map create mode 100644 rollup.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..598a080 --- /dev/null +++ b/.babelrc @@ -0,0 +1,8 @@ +{ + "plugins": [ + ["@babel/plugin-transform-modules-commonjs"] + ], + "presets": [ + ["@babel/env"] + ] +} diff --git a/.eslintignore b/.eslintignore index 3c3629e..dbb4d3f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,3 @@ node_modules +dist +docs/jsdoc diff --git a/.eslintrc.js b/.eslintrc.js index 9d0faba..d7fc4fd 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,29 +3,33 @@ module.exports = { "env": { "browser": true, - "commonjs": true, "es6": true, "node": true, "mocha": true }, - "extends": ["ash-nazg/sauron-node", "plugin:node/recommended-script"], + "extends": ["ash-nazg/sauron-node"], "parserOptions": { - "ecmaVersion": 2018 + "ecmaVersion": 2018, + "sourceType": "module" }, - "overrides": { - files: ["**/*.md"], - rules: { - "eol-last": "off", - "no-console": "off", - "no-undef": "off", - "no-unused-vars": ["warn"], - "padded-blocks": "off", - "import/unambiguous": "off", - "import/no-unresolved": "off", - "node/no-missing-import": "off" - } + "settings": { + "polyfills": [ + "console", + "Error" + ] }, "overrides": [ + { + files: "docs/jsdoc-config.js", + globals: { + "module": "readonly" + }, + rules: { + strict: "off", + "import/unambiguous": "off", + "import/no-commonjs": "off" + } + }, { files: ["**/*.md"], rules: { @@ -75,9 +79,6 @@ module.exports = { "unicorn/no-zero-fractions": "off", "require-unicode-regexp": "off", "yoda": "off", - "valid-jsdoc": 0, - "import/unambiguous": 0, - "global-require": 0, - "import/no-commonjs": 0 + "valid-jsdoc": 0 } }; diff --git a/.npmignore b/.npmignore index d68847e..cf52ce9 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,4 @@ examples docs/jsdoc test +rollup.config.js diff --git a/dist/index-esm.js b/dist/index-esm.js new file mode 100644 index 0000000..90f86f1 --- /dev/null +++ b/dist/index-esm.js @@ -0,0 +1,4098 @@ +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +var Point2D_1 = createCommonjsModule(function (module) { +/** + * + * Point2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + * + */ + +/** + * Point2D + * + * @param {Number} x + * @param {Number} y + * @returns {Point2D} + */ +function Point2D(x, y) { + Object.defineProperties(this, { + "x": { + value: x !== undefined ? x : 0.0, + writable: false, + enumerable: true, + configurable: false + }, + "y": { + value: y !== undefined ? y : 0.0, + writable: false, + enumerable: true, + configurable: false + } + }); +} +/** + * clone + * + * @returns {Point2D} + */ + + +Point2D.prototype.clone = function () { + return new this.constructor(this.x, this.y); +}; +/** + * add + * + * @param {Point2D|Vector2D} that + * @returns {Point2D} + */ + + +Point2D.prototype.add = function (that) { + return new this.constructor(this.x + that.x, this.y + that.y); +}; +/** + * subtract + * + * @param { Vector2D | Point2D } that + * @returns {Point2D} + */ + + +Point2D.prototype.subtract = function (that) { + return new this.constructor(this.x - that.x, this.y - that.y); +}; +/** + * multiply + * + * @param {Number} scalar + * @returns {Point2D} + */ + + +Point2D.prototype.multiply = function (scalar) { + return new this.constructor(this.x * scalar, this.y * scalar); +}; +/** + * divide + * + * @param {Number} scalar + * @returns {Point2D} + */ + + +Point2D.prototype.divide = function (scalar) { + return new this.constructor(this.x / scalar, this.y / scalar); +}; +/** + * equals + * + * @param {Point2D} that + * @returns {Boolean} + */ + + +Point2D.prototype.equals = function (that) { + return this.x === that.x && this.y === that.y; +}; +/** + * precisionEquals + * + * @param {Point2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + +Point2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; +}; // utility methods + +/** + * lerp + * + * @param { Vector2D | Point2D } that + * @param {Number} t + @ @returns {Point2D} + */ + + +Point2D.prototype.lerp = function (that, t) { + var omt = 1.0 - t; + return new this.constructor(this.x * omt + that.x * t, this.y * omt + that.y * t); +}; +/** + * distanceFrom + * + * @param {Point2D} that + * @returns {Number} + */ + + +Point2D.prototype.distanceFrom = function (that) { + var dx = this.x - that.x; + var dy = this.y - that.y; + return Math.sqrt(dx * dx + dy * dy); +}; +/** + * min + * + * @param {Point2D} that + * @returns {Number} + */ + + +Point2D.prototype.min = function (that) { + return new this.constructor(Math.min(this.x, that.x), Math.min(this.y, that.y)); +}; +/** + * max + * + * @param {Point2D} that + * @returns {Number} + */ + + +Point2D.prototype.max = function (that) { + return new this.constructor(Math.max(this.x, that.x), Math.max(this.y, that.y)); +}; +/** + * transform + * + * @param {Matrix2D} + * @result {Point2D} + */ + + +Point2D.prototype.transform = function (matrix) { + return new this.constructor(matrix.a * this.x + matrix.c * this.y + matrix.e, matrix.b * this.x + matrix.d * this.y + matrix.f); +}; +/** + * toString + * + * @returns {String} + */ + + +Point2D.prototype.toString = function () { + return "point(" + this.x + "," + this.y + ")"; +}; + +{ + module.exports = Point2D; +} +}); + +var Vector2D_1 = createCommonjsModule(function (module) { +/** + * + * Vector2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + * + */ + +/** + * Vector2D + * + * @param {Number} x + * @param {Number} y + * @returns {Vector2D} + */ +function Vector2D(x, y) { + Object.defineProperties(this, { + "x": { + value: x !== undefined ? x : 0.0, + writable: false, + enumerable: true, + configurable: false + }, + "y": { + value: y !== undefined ? y : 0.0, + writable: false, + enumerable: true, + configurable: false + } + }); +} +/** + * fromPoints + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @returns {Vector2D} + */ + + +Vector2D.fromPoints = function (p1, p2) { + return new Vector2D(p2.x - p1.x, p2.y - p1.y); +}; +/** + * length + * + * @returns {Number} + */ + + +Vector2D.prototype.length = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); +}; +/** + * magnitude + * + * @returns {Number} + */ + + +Vector2D.prototype.magnitude = function () { + return this.x * this.x + this.y * this.y; +}; +/** + * dot + * + * @param {Vector2D} that + * @returns {Number} + */ + + +Vector2D.prototype.dot = function (that) { + return this.x * that.x + this.y * that.y; +}; +/** + * cross + * + * @param {Vector2D} that + * @returns {Number} + */ + + +Vector2D.prototype.cross = function (that) { + return this.x * that.y - this.y * that.x; +}; +/** + * determinant + * + * @param {Vector2D} that + * @returns {Number} + */ + + +Vector2D.prototype.determinant = function (that) { + return this.x * that.y - this.y * that.x; +}; +/** + * unit + * + * @returns {Vector2D} + */ + + +Vector2D.prototype.unit = function () { + return this.divide(this.length()); +}; +/** + * add + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + +Vector2D.prototype.add = function (that) { + return new this.constructor(this.x + that.x, this.y + that.y); +}; +/** + * subtract + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + +Vector2D.prototype.subtract = function (that) { + return new this.constructor(this.x - that.x, this.y - that.y); +}; +/** + * multiply + * + * @param {Number} scalar + * @returns {Vector2D} + */ + + +Vector2D.prototype.multiply = function (scalar) { + return new this.constructor(this.x * scalar, this.y * scalar); +}; +/** + * divide + * + * @param {Number} scalar + * @returns {Vector2D} + */ + + +Vector2D.prototype.divide = function (scalar) { + return new this.constructor(this.x / scalar, this.y / scalar); +}; +/** + * angleBetween + * + * @param {Vector2D} that + * @returns {Number} + */ + + +Vector2D.prototype.angleBetween = function (that) { + var cos = this.dot(that) / (this.length() * that.length()); + cos = Math.max(-1, Math.min(cos, 1)); + var radians = Math.acos(cos); + return this.cross(that) < 0.0 ? -radians : radians; +}; +/** + * Find a vector is that is perpendicular to this vector + * + * @returns {Vector2D} + */ + + +Vector2D.prototype.perp = function () { + return new this.constructor(-this.y, this.x); +}; +/** + * Find the component of the specified vector that is perpendicular to + * this vector + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + +Vector2D.prototype.perpendicular = function (that) { + return this.subtract(this.project(that)); +}; +/** + * project + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + +Vector2D.prototype.project = function (that) { + var percent = this.dot(that) / that.dot(that); + return that.multiply(percent); +}; +/** + * transform + * + * @param {Matrix2D} + * @returns {Vector2D} + */ + + +Vector2D.prototype.transform = function (matrix) { + return new this.constructor(matrix.a * this.x + matrix.c * this.y, matrix.b * this.x + matrix.d * this.y); +}; +/** + * equals + * + * @param {Vector2D} that + * @returns {Boolean} + */ + + +Vector2D.prototype.equals = function (that) { + return this.x === that.x && this.y === that.y; +}; +/** + * precisionEquals + * + * @param {Vector2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + +Vector2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; +}; +/** + * toString + * + * @returns {String} + */ + + +Vector2D.prototype.toString = function () { + return "vector(" + this.x + "," + this.y + ")"; +}; + +{ + module.exports = Vector2D; +} +}); + +var Matrix2D_1 = createCommonjsModule(function (module) { +/** + * Matrix2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + */ +function setReadonlyProperty(object, property, value) { + Object.defineProperty(object, property, { + value: value, + writable: false, + enumerable: true, + configurable: false + }); +} +/** + * Identity matrix + * + * @returns {Matrix2D} + */ + + +setReadonlyProperty(Matrix2D, "IDENTITY", new Matrix2D(1, 0, 0, 1, 0, 0)); +setReadonlyProperty(Matrix2D.IDENTITY, "isIdentity", function () { + return true; +}); +/** + * Matrix2D + * + * [a c e] + * [b d f] + * [0 0 1] + * + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + * @param {Number} e + * @param {Number} f + * @returns {Matrix2D} + */ + +function Matrix2D(a, b, c, d, e, f) { + setReadonlyProperty(this, "a", a !== undefined ? a : 1); + setReadonlyProperty(this, "b", b !== undefined ? b : 0); + setReadonlyProperty(this, "c", c !== undefined ? c : 0); + setReadonlyProperty(this, "d", d !== undefined ? d : 1); + setReadonlyProperty(this, "e", e !== undefined ? e : 0); + setReadonlyProperty(this, "f", f !== undefined ? f : 0); +} // *** STATIC METHODS + +/** + * translation + * + * @param {Number} tx + * @param {Number} ty + * @returns {Matrix2D} + */ + + +Matrix2D.translation = function (tx, ty) { + return new Matrix2D(1, 0, 0, 1, tx, ty); +}; +/** + * scaling + * + * @param {Number} scale + * @returns {Matrix2D} + */ + + +Matrix2D.scaling = function (scale) { + return new Matrix2D(scale, 0, 0, scale, 0, 0); +}; +/** + * scalingAt + * + * @param {Number} scale + * @param {Point2D} center + * @returns {Matrix2D} + */ + + +Matrix2D.scalingAt = function (scale, center) { + return new Matrix2D(scale, 0, 0, scale, center.x - center.x * scale, center.y - center.y * scale); +}; +/** + * nonUniformScaling + * + * @param {Number} scaleX + * @param {Number} scaleY + * @returns {Matrix2D} + */ + + +Matrix2D.nonUniformScaling = function (scaleX, scaleY) { + return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0); +}; +/** + * nonUniformScalingAt + * + * @param {Number} scaleX + * @param {Number} scaleY + * @param {Point2D} center + * @returns {Matrix2D} + */ + + +Matrix2D.nonUniformScalingAt = function (scaleX, scaleY, center) { + return new Matrix2D(scaleX, 0, 0, scaleY, center.x - center.x * scaleX, center.y - center.y * scaleY); +}; +/** + * rotation + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + +Matrix2D.rotation = function (radians) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new Matrix2D(c, s, -s, c, 0, 0); +}; +/** + * rotationAt + * + * @param {Number} radians + * @param {Point2D} center + * @returns {Matrix2D} + */ + + +Matrix2D.rotationAt = function (radians, center) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new Matrix2D(c, s, -s, c, center.x - center.x * c + center.y * s, center.y - center.y * c - center.x * s); +}; +/** + * rotationFromVector + * + * @param {Vector2D} + * @returns {Matrix2D} + */ + + +Matrix2D.rotationFromVector = function (vector) { + var unit = vector.unit(); + var c = unit.x; // cos + + var s = unit.y; // sin + + return new Matrix2D(c, s, -s, c, 0, 0); +}; +/** + * xFlip + * + * @returns {Matrix2D} + */ + + +Matrix2D.xFlip = function () { + return new Matrix2D(-1, 0, 0, 1, 0, 0); +}; +/** + * yFlip + * + * @returns {Matrix2D} + */ + + +Matrix2D.yFlip = function () { + return new Matrix2D(1, 0, 0, -1, 0, 0); +}; +/** + * xSkew + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + +Matrix2D.xSkew = function (radians) { + var t = Math.tan(radians); + return new Matrix2D(1, 0, t, 1, 0, 0); +}; +/** + * ySkew + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + +Matrix2D.ySkew = function (radians) { + var t = Math.tan(radians); + return new Matrix2D(1, t, 0, 1, 0, 0); +}; // *** METHODS + +/** + * multiply + * + * @pararm {Matrix2D} that + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.multiply = function (that) { + if (this.isIdentity()) { + return that; + } + + if (that.isIdentity()) { + return this; + } + + return new this.constructor(this.a * that.a + this.c * that.b, this.b * that.a + this.d * that.b, this.a * that.c + this.c * that.d, this.b * that.c + this.d * that.d, this.a * that.e + this.c * that.f + this.e, this.b * that.e + this.d * that.f + this.f); +}; +/** + * inverse + * + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.inverse = function () { + if (this.isIdentity()) { + return this; + } + + var det1 = this.a * this.d - this.b * this.c; + + if (det1 === 0.0) { + throw "Matrix is not invertible"; + } + + var idet = 1.0 / det1; + var det2 = this.f * this.c - this.e * this.d; + var det3 = this.e * this.b - this.f * this.a; + return new this.constructor(this.d * idet, -this.b * idet, -this.c * idet, this.a * idet, det2 * idet, det3 * idet); +}; +/** + * translate + * + * @param {Number} tx + * @param {Number} ty + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.translate = function (tx, ty) { + return new this.constructor(this.a, this.b, this.c, this.d, this.a * tx + this.c * ty + this.e, this.b * tx + this.d * ty + this.f); +}; +/** + * scale + * + * @param {Number} scale + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.scale = function (scale) { + return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.e, this.f); +}; +/** + * scaleAt + * + * @param {Number} scale + * @param {Point2D} center + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.scaleAt = function (scale, center) { + var dx = center.x - scale * center.x; + var dy = center.y - scale * center.y; + return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); +}; +/** + * scaleNonUniform + * + * @param {Number} scaleX + * @param {Number} scaleY + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.scaleNonUniform = function (scaleX, scaleY) { + return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.e, this.f); +}; +/** + * scaleNonUniformAt + * + * @param {Number} scaleX + * @param {Number} scaleY + * @param {Point2D} center + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.scaleNonUniformAt = function (scaleX, scaleY, center) { + var dx = center.x - scaleX * center.x; + var dy = center.y - scaleY * center.y; + return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); +}; +/** + * rotate + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.rotate = function (radians) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); +}; +/** + * rotateAt + * + * @param {Number} radians + * @param {Point2D} center + * @result {Matrix2D} + */ + + +Matrix2D.prototype.rotateAt = function (radians, center) { + var cos = Math.cos(radians); + var sin = Math.sin(radians); + var cx = center.x; + var cy = center.y; + var a = this.a * cos + this.c * sin; + var b = this.b * cos + this.d * sin; + var c = this.c * cos - this.a * sin; + var d = this.d * cos - this.b * sin; + return new this.constructor(a, b, c, d, (this.a - a) * cx + (this.c - c) * cy + this.e, (this.b - b) * cx + (this.d - d) * cy + this.f); +}; +/** + * rotateFromVector + * + * @param {Vector2D} + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.rotateFromVector = function (vector) { + var unit = vector.unit(); + var c = unit.x; // cos + + var s = unit.y; // sin + + return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); +}; +/** + * flipX + * + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.flipX = function () { + return new this.constructor(-this.a, -this.b, this.c, this.d, this.e, this.f); +}; +/** + * flipY + * + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.flipY = function () { + return new this.constructor(this.a, this.b, -this.c, -this.d, this.e, this.f); +}; +/** + * skewX + * + * @pararm {Number} radians + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.skewX = function (radians) { + var t = Math.tan(radians); + return new this.constructor(this.a, this.b, this.c + this.a * t, this.d + this.b * t, this.e, this.f); +}; // TODO: skewXAt + +/** + * skewY + * + * @pararm {Number} radians + * @returns {Matrix2D} + */ + + +Matrix2D.prototype.skewY = function (radians) { + var t = Math.tan(radians); + return new this.constructor(this.a + this.c * t, this.b + this.d * t, this.c, this.d, this.e, this.f); +}; // TODO: skewYAt + +/** + * isIdentity + * + * @returns {Boolean} + */ + + +Matrix2D.prototype.isIdentity = function () { + return this.a === 1.0 && this.b === 0.0 && this.c === 0.0 && this.d === 1.0 && this.e === 0.0 && this.f === 0.0; +}; +/** + * isInvertible + * + * @returns {Boolean} + */ + + +Matrix2D.prototype.isInvertible = function () { + return this.a * this.d - this.b * this.c !== 0.0; +}; +/** + * getScale + * + * @returns {{ scaleX: Number, scaleY: Number }} + */ + + +Matrix2D.prototype.getScale = function () { + return { + scaleX: Math.sqrt(this.a * this.a + this.c * this.c), + scaleY: Math.sqrt(this.b * this.b + this.d * this.d) + }; +}; +/** + * getDecomposition + * + * Calculates matrix Singular Value Decomposition + * + * The resulting matrices, translation, rotation, scale, and rotation0, return + * this matrix when they are muliplied together in the listed order + * + * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688} + * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation} + * + * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }} + */ + + +Matrix2D.prototype.getDecomposition = function () { + var E = (this.a + this.d) * 0.5; + var F = (this.a - this.d) * 0.5; + var G = (this.b + this.c) * 0.5; + var H = (this.b - this.c) * 0.5; + var Q = Math.sqrt(E * E + H * H); + var R = Math.sqrt(F * F + G * G); + var scaleX = Q + R; + var scaleY = Q - R; + var a1 = Math.atan2(G, F); + var a2 = Math.atan2(H, E); + var theta = (a2 - a1) * 0.5; + var phi = (a2 + a1) * 0.5; // TODO: Add static methods to generate translation, rotation, etc. + // matrices directly + + return { + translation: new this.constructor(1, 0, 0, 1, this.e, this.f), + rotation: this.constructor.IDENTITY.rotate(phi), + scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0), + rotation0: this.constructor.IDENTITY.rotate(theta) + }; +}; +/** + * equals + * + * @param {Matrix2D} that + * @returns {Boolean} + */ + + +Matrix2D.prototype.equals = function (that) { + return this.a === that.a && this.b === that.b && this.c === that.c && this.d === that.d && this.e === that.e && this.f === that.f; +}; +/** + * precisionEquals + * + * @param {Matrix2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + +Matrix2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.a - that.a) < precision && Math.abs(this.b - that.b) < precision && Math.abs(this.c - that.c) < precision && Math.abs(this.d - that.d) < precision && Math.abs(this.e - that.e) < precision && Math.abs(this.f - that.f) < precision; +}; +/** + * toString + * + * @returns {String} + */ + + +Matrix2D.prototype.toString = function () { + return "matrix(" + [this.a, this.b, this.c, this.d, this.e, this.f].join(",") + ")"; +}; + +{ + module.exports = Matrix2D; +} +}); + +// expose classes +var Point2D = Point2D_1; +var Vector2D = Vector2D_1; +var Matrix2D = Matrix2D_1; + +var Polynomial_1 = createCommonjsModule(function (module) { +/** + * + * Polynomial.js + * + * copyright 2002, 2013 Kevin Lindsey + * + * contribution {@link http://github.com/Quazistax/kld-polynomial} + * @copyright 2015 Robert Benko (Quazistax) + * @license MIT + */ +Polynomial.TOLERANCE = 1e-6; +Polynomial.ACCURACY = 15; +/** + * interpolate + * + * Based on poloint in "Numerical Recipes in C, 2nd Edition", pages 109-110 + * + * @param {Array} xs + * @param {Array} ys + * @param {Number} n + * @param {Number} offset + * @param {Number} x + * + * @returns {{y: Number, dy: Number}} + */ + +Polynomial.interpolate = function (xs, ys, n, offset, x) { + if (xs.constructor !== Array || ys.constructor !== Array) { + throw new Error("Polynomial.interpolate: xs and ys must be arrays"); + } + + if (isNaN(n) || isNaN(offset) || isNaN(x)) { + throw new Error("Polynomial.interpolate: n, offset, and x must be numbers"); + } + + var y = 0; + var dy = 0; + var c = new Array(n); + var d = new Array(n); + var ns = 0; + var diff = Math.abs(x - xs[offset]); + + for (var i = 0; i < n; i++) { + var dift = Math.abs(x - xs[offset + i]); + + if (dift < diff) { + ns = i; + diff = dift; + } + + c[i] = d[i] = ys[offset + i]; + } + + y = ys[offset + ns]; + ns--; + + for (var m = 1; m < n; m++) { + for (var i = 0; i < n - m; i++) { + var ho = xs[offset + i] - x; + var hp = xs[offset + i + m] - x; + var w = c[i + 1] - d[i]; + var den = ho - hp; + + if (den == 0.0) { + throw new Error("Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)"); + } + + den = w / den; + d[i] = hp * den; + c[i] = ho * den; + } + + dy = 2 * (ns + 1) < n - m ? c[ns + 1] : d[ns--]; + y += dy; + } + + return { + y: y, + dy: dy + }; +}; +/** + * Polynomial + * + * @returns {Polynomial} + */ + + +function Polynomial() { + this.init(arguments); +} +/** + * init + */ + + +Polynomial.prototype.init = function (coefs) { + this.coefs = new Array(); + + for (var i = coefs.length - 1; i >= 0; i--) { + this.coefs.push(coefs[i]); + } + + this._variable = "t"; + this._s = 0; +}; +/** + * eval + */ + + +Polynomial.prototype.eval = function (x) { + if (isNaN(x)) { + throw new Error("Polynomial.eval: parameter must be a number"); + } + + var result = 0; + + for (var i = this.coefs.length - 1; i >= 0; i--) { + result = result * x + this.coefs[i]; + } + + return result; +}; +/** + * add + */ + + +Polynomial.prototype.add = function (that) { + var result = new Polynomial(); + var d1 = this.getDegree(); + var d2 = that.getDegree(); + var dmax = Math.max(d1, d2); + + for (var i = 0; i <= dmax; i++) { + var v1 = i <= d1 ? this.coefs[i] : 0; + var v2 = i <= d2 ? that.coefs[i] : 0; + result.coefs[i] = v1 + v2; + } + + return result; +}; +/** + * multiply + */ + + +Polynomial.prototype.multiply = function (that) { + var result = new Polynomial(); + + for (var i = 0; i <= this.getDegree() + that.getDegree(); i++) { + result.coefs.push(0); + } + + for (var i = 0; i <= this.getDegree(); i++) { + for (var j = 0; j <= that.getDegree(); j++) { + result.coefs[i + j] += this.coefs[i] * that.coefs[j]; + } + } + + return result; +}; +/** + * divide_scalar + */ + + +Polynomial.prototype.divide_scalar = function (scalar) { + for (var i = 0; i < this.coefs.length; i++) { + this.coefs[i] /= scalar; + } +}; +/** + * simplify + */ + + +Polynomial.prototype.simplify = function (TOLERANCE) { + if (TOLERANCE === undefined) TOLERANCE = 1e-12; + + for (var i = this.getDegree(); i >= 0; i--) { + if (Math.abs(this.coefs[i]) <= TOLERANCE) { + this.coefs.pop(); + } else { + break; + } + } +}; +/** + * bisection + */ + + +Polynomial.prototype.bisection = function (min, max) { + var minValue = this.eval(min); + var maxValue = this.eval(max); + var result; + + if (Math.abs(minValue) <= Polynomial.TOLERANCE) { + result = min; + } else if (Math.abs(maxValue) <= Polynomial.TOLERANCE) { + result = max; + } else if (minValue * maxValue <= 0) { + var tmp1 = Math.log(max - min); + var tmp2 = Math.LN10 * Polynomial.ACCURACY; + var iters = Math.ceil((tmp1 + tmp2) / Math.LN2); + + for (var i = 0; i < iters; i++) { + result = 0.5 * (min + max); + var value = this.eval(result); + + if (Math.abs(value) <= Polynomial.TOLERANCE) { + break; + } + + if (value * minValue < 0) { + max = result; + maxValue = value; + } else { + min = result; + minValue = value; + } + } + } + + return result; +}; +/** + * toString + */ + + +Polynomial.prototype.toString = function () { + var coefs = new Array(); + var signs = new Array(); + + for (var i = this.coefs.length - 1; i >= 0; i--) { + var value = Math.round(this.coefs[i] * 1000) / 1000; //var value = this.coefs[i]; + + if (value != 0) { + var sign = value < 0 ? " - " : " + "; + value = Math.abs(value); + + if (i > 0) { + if (value == 1) { + value = this._variable; + } else { + value += this._variable; + } + } + + if (i > 1) { + value += "^" + i; + } + + signs.push(sign); + coefs.push(value); + } + } + + signs[0] = signs[0] == " + " ? "" : "-"; + var result = ""; + + for (var i = 0; i < coefs.length; i++) { + result += signs[i] + coefs[i]; + } + + return result; +}; +/** + * trapezoid + * + * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 137 + */ + + +Polynomial.prototype.trapezoid = function (min, max, n) { + if (isNaN(min) || isNaN(max) || isNaN(n)) { + throw new Error("Polynomial.trapezoid: parameters must be numbers"); + } + + var range = max - min; + + if (n == 1) { + var minValue = this.eval(min); + var maxValue = this.eval(max); + this._s = 0.5 * range * (minValue + maxValue); + } else { + var it = 1 << n - 2; + var delta = range / it; + var x = min + 0.5 * delta; + var sum = 0; + + for (var i = 0; i < it; i++) { + sum += this.eval(x); + x += delta; + } + + this._s = 0.5 * (this._s + range * sum / it); + } + + if (isNaN(this._s)) { + throw new Error("Polynomial.trapezoid: this._s is NaN"); + } + + return this._s; +}; +/** + * simpson + * + * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 139 + */ + + +Polynomial.prototype.simpson = function (min, max) { + if (isNaN(min) || isNaN(max)) { + throw new Error("Polynomial.simpson: parameters must be numbers"); + } + + var range = max - min; + var st = 0.5 * range * (this.eval(min) + this.eval(max)); + var t = st; + var s = 4.0 * st / 3.0; + var os = s; + var ost = st; + var TOLERANCE = 1e-7; + var it = 1; + + for (var n = 2; n <= 20; n++) { + var delta = range / it; + var x = min + 0.5 * delta; + var sum = 0; + + for (var i = 1; i <= it; i++) { + sum += this.eval(x); + x += delta; + } + + t = 0.5 * (t + range * sum / it); + st = t; + s = (4.0 * st - ost) / 3.0; + + if (Math.abs(s - os) < TOLERANCE * Math.abs(os)) { + break; + } + + os = s; + ost = st; + it <<= 1; + } + + return s; +}; +/** + * romberg + */ + + +Polynomial.prototype.romberg = function (min, max) { + if (isNaN(min) || isNaN(max)) { + throw new Error("Polynomial.romberg: parameters must be numbers"); + } + + var MAX = 20; + var K = 3; + var TOLERANCE = 1e-6; + var s = new Array(MAX + 1); + var h = new Array(MAX + 1); + var result = { + y: 0, + dy: 0 + }; + h[0] = 1.0; + + for (var j = 1; j <= MAX; j++) { + s[j - 1] = this.trapezoid(min, max, j); + + if (j >= K) { + result = Polynomial.interpolate(h, s, K, j - K, 0.0); + if (Math.abs(result.dy) <= TOLERANCE * result.y) break; + } + + s[j] = s[j - 1]; + h[j] = 0.25 * h[j - 1]; + } + + return result.y; +}; // getters and setters + +/** + * get degree + */ + + +Polynomial.prototype.getDegree = function () { + return this.coefs.length - 1; +}; +/** + * getDerivative + */ + + +Polynomial.prototype.getDerivative = function () { + var derivative = new Polynomial(); + + for (var i = 1; i < this.coefs.length; i++) { + derivative.coefs.push(i * this.coefs[i]); + } + + return derivative; +}; +/** + * getRoots + */ + + +Polynomial.prototype.getRoots = function () { + var result; + this.simplify(); + + switch (this.getDegree()) { + case 0: + result = []; + break; + + case 1: + result = this.getLinearRoot(); + break; + + case 2: + result = this.getQuadraticRoots(); + break; + + case 3: + result = this.getCubicRoots(); + break; + + case 4: + result = this.getQuarticRoots(); + break; + + default: + result = []; + } + + return result; +}; +/** + * getRootsInInterval + */ + + +Polynomial.prototype.getRootsInInterval = function (min, max) { + var roots = new Array(); + var root; + + if (this.getDegree() == 1) { + root = this.bisection(min, max); + + if (root != null) { + roots.push(root); + } + } else { + // get roots of derivative + var deriv = this.getDerivative(); + var droots = deriv.getRootsInInterval(min, max); + + if (droots.length > 0) { + // find root on [min, droots[0]] + root = this.bisection(min, droots[0]); + + if (root != null) { + roots.push(root); + } // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2 + + + for (i = 0; i <= droots.length - 2; i++) { + root = this.bisection(droots[i], droots[i + 1]); + + if (root != null) { + roots.push(root); + } + } // find root on [droots[count-1],xmax] + + + root = this.bisection(droots[droots.length - 1], max); + + if (root != null) { + roots.push(root); + } + } else { + // polynomial is monotone on [min,max], has at most one root + root = this.bisection(min, max); + + if (root != null) { + roots.push(root); + } + } + } + + return roots; +}; +/** + * getLinearRoot + */ + + +Polynomial.prototype.getLinearRoot = function () { + var result = []; + var a = this.coefs[1]; + + if (a != 0) { + result.push(-this.coefs[0] / a); + } + + return result; +}; +/** + * getQuadraticRoots + */ + + +Polynomial.prototype.getQuadraticRoots = function () { + var results = []; + + if (this.getDegree() == 2) { + var a = this.coefs[2]; + var b = this.coefs[1] / a; + var c = this.coefs[0] / a; + var d = b * b - 4 * c; + + if (d > 0) { + var e = Math.sqrt(d); + results.push(0.5 * (-b + e)); + results.push(0.5 * (-b - e)); + } else if (d == 0) { + // really two roots with same value, but we only return one + results.push(0.5 * -b); + } + } + + return results; +}; +/** + * getCubicRoots + * + * This code is based on MgcPolynomial.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.geometrictools.com + */ + + +Polynomial.prototype.getCubicRoots = function () { + var results = []; + + if (this.getDegree() == 3) { + var c3 = this.coefs[3]; + var c2 = this.coefs[2] / c3; + var c1 = this.coefs[1] / c3; + var c0 = this.coefs[0] / c3; + var a = (3 * c1 - c2 * c2) / 3; + var b = (2 * c2 * c2 * c2 - 9 * c1 * c2 + 27 * c0) / 27; + var offset = c2 / 3; + var discrim = b * b / 4 + a * a * a / 27; + var halfB = b / 2; + var ZEROepsilon = this.zeroErrorEstimate(); + + if (Math.abs(discrim) <= ZEROepsilon) { + discrim = 0; + } + + if (discrim > 0) { + var e = Math.sqrt(discrim); + var tmp; + var root; + tmp = -halfB + e; + + if (tmp >= 0) { + root = Math.pow(tmp, 1 / 3); + } else { + root = -Math.pow(-tmp, 1 / 3); + } + + tmp = -halfB - e; + + if (tmp >= 0) { + root += Math.pow(tmp, 1 / 3); + } else { + root -= Math.pow(-tmp, 1 / 3); + } + + results.push(root - offset); + } else if (discrim < 0) { + var distance = Math.sqrt(-a / 3); + var angle = Math.atan2(Math.sqrt(-discrim), -halfB) / 3; + var cos = Math.cos(angle); + var sin = Math.sin(angle); + var sqrt3 = Math.sqrt(3); + results.push(2 * distance * cos - offset); + results.push(-distance * (cos + sqrt3 * sin) - offset); + results.push(-distance * (cos - sqrt3 * sin) - offset); + } else { + var tmp; + + if (halfB >= 0) { + tmp = -Math.pow(halfB, 1 / 3); + } else { + tmp = Math.pow(-halfB, 1 / 3); + } + + results.push(2 * tmp - offset); // really should return next root twice, but we return only one + + results.push(-tmp - offset); + } + } + + return results; +}; +/** + * Sign of a number (+1, -1, +0, -0). + */ + + +var sign = function sign(x) { + return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN; +}; +/** + * Calculates roots of quartic polynomial.
+ * First, derivative roots are found, then used to split quartic polynomial + * into segments, each containing one root of quartic polynomial. + * Segments are then passed to newton's method to find roots. + * + * @returns {Array} roots + */ + + +Polynomial.prototype.getQuarticRoots = function () { + var results = []; + var n = this.getDegree(); + + if (n == 4) { + var poly = new Polynomial(); + poly.coefs = this.coefs.slice(); + poly.divide_scalar(poly.coefs[n]); + var ERRF = 1e-15; + + if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) { + poly.coefs[0] = 0; + } + + var poly_d = poly.getDerivative(); + var derrt = poly_d.getRoots().sort(function (a, b) { + return a - b; + }); + var dery = []; + var nr = derrt.length - 1; + var i; + var rb = this.bounds(); + maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); + var ZEROepsilon = this.zeroErrorEstimate(maxabsX); + + for (i = 0; i <= nr; i++) { + dery.push(poly.eval(derrt[i])); + } + + for (i = 0; i <= nr; i++) { + if (Math.abs(dery[i]) < ZEROepsilon) { + dery[i] = 0; + } + } + + i = 0; + var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF); + var guesses = []; + var minmax = []; + + if (nr > -1) { + if (dery[0] != 0) { + if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) { + guesses.push(derrt[0] - dx); + minmax.push([rb.minX, derrt[0]]); + } + } else { + results.push(derrt[0], derrt[0]); + i++; + } + + for (; i < nr; i++) { + if (dery[i + 1] == 0) { + results.push(derrt[i + 1], derrt[i + 1]); + i++; + } else if (sign(dery[i]) != sign(dery[i + 1])) { + guesses.push((derrt[i] + derrt[i + 1]) / 2); + minmax.push([derrt[i], derrt[i + 1]]); + } + } + + if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) { + guesses.push(derrt[nr] + dx); + minmax.push([derrt[nr], rb.maxX]); + } + } + + var f = function f(x) { + return poly.eval(x); + }; + + var df = function df(x) { + return poly_d.eval(x); + }; + + if (guesses.length > 0) { + for (i = 0; i < guesses.length; i++) { + guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]); + } + } + + results = results.concat(guesses); + } + + return results; +}; +/** + * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0. + * + * @returns {Number} + */ + + +Polynomial.prototype.zeroErrorEstimate = function (maxabsX) { + var poly = this; + var ERRF = 1e-15; + + if (typeof maxabsX === 'undefined') { + var rb = poly.bounds(); + maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); + } + + if (maxabsX < 0.001) { + return 2 * Math.abs(poly.eval(ERRF)); + } + + var n = poly.coefs.length - 1; + var an = poly.coefs[n]; + return 10 * ERRF * poly.coefs.reduce(function (m, v, i) { + var nm = v / an * Math.pow(maxabsX, i); + return nm > m ? nm : m; + }, 0); +}; +/** + * Calculates upper Real roots bounds.
+ * Real roots are in interval [negX, posX]. Determined by Fujiwara method. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ negX: Number, posX: Number }} + */ + + +Polynomial.prototype.bounds_UpperReal_Fujiwara = function () { + var a = this.coefs; + var n = a.length - 1; + var an = a[n]; + + if (an != 1) { + a = this.coefs.map(function (v) { + return v / an; + }); + } + + var b = a.map(function (v, i) { + return i < n ? Math.pow(Math.abs(i == 0 ? v / 2 : v), 1 / (n - i)) : v; + }); + var coefSelectionFunc; + + var find2Max = function find2Max(acc, bi, i) { + if (coefSelectionFunc(i)) { + if (acc.max < bi) { + acc.nearmax = acc.max; + acc.max = bi; + } else if (acc.nearmax < bi) { + acc.nearmax = bi; + } + } + + return acc; + }; + + coefSelectionFunc = function coefSelectionFunc(i) { + return i < n && a[i] < 0; + }; + + var max_nearmax_pos = b.reduce(find2Max, { + max: 0, + nearmax: 0 + }); + + coefSelectionFunc = function coefSelectionFunc(i) { + return i < n && (n % 2 == i % 2 ? a[i] < 0 : a[i] > 0); + }; + + var max_nearmax_neg = b.reduce(find2Max, { + max: 0, + nearmax: 0 + }); + return { + negX: -2 * max_nearmax_neg.max, + posX: 2 * max_nearmax_pos.max + }; +}; +/** + * Calculates lower Real roots bounds.
+ * There are no Real roots in interval . Determined by Fujiwara method. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ negX: Number, posX: Number }} + */ + + +Polynomial.prototype.bounds_LowerReal_Fujiwara = function () { + var poly = new Polynomial(); + poly.coefs = this.coefs.slice().reverse(); + var res = poly.bounds_UpperReal_Fujiwara(); + res.negX = 1 / res.negX; + res.posX = 1 / res.posX; + return res; +}; +/** + * Calculates left and right Real roots bounds.
+ * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ minX: Number, maxX: Number }} +*/ + + +Polynomial.prototype.bounds = function () { + var urb = this.bounds_UpperReal_Fujiwara(); + var rb = { + minX: urb.negX, + maxX: urb.posX + }; + + if (urb.negX === 0 && urb.posX === 0) { + return rb; + } + + if (urb.negX === 0) { + rb.minX = this.bounds_LowerReal_Fujiwara().posX; + } else if (urb.posX === 0) { + rb.maxX = this.bounds_LowerReal_Fujiwara().negX; + } + + if (rb.minX > rb.maxX) { + //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?'); + rb.minX = rb.maxX = 0; + } + + return rb; // TODO: if sure that there are no complex roots + // (maybe by using Sturm's theorem) use: + // return this.bounds_Real_Laguerre(); +}; +/** + * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
+ * When using bounds, algorithm falls back to secant if newton goes out of range. + * Bisection is fallback for secant when determined secant is not efficient enough. + * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method} + * @see {@link http://en.wikipedia.org/wiki/Secant_method} + * @see {@link http://en.wikipedia.org/wiki/Bisection_method} + * + * @param {Number} x0 - Inital root guess + * @param {function(x)} f - Function which root we are trying to find + * @param {function(x)} df - Derivative of function f + * @param {Number} max_iterations - Maximum number of algorithm iterations + * @param {Number} [min_x] - Left bound value + * @param {Number} [max_x] - Right bound value + * @returns {Number} - root + */ + + +Polynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) { + var x, + prev_dfx = 0, + dfx, + prev_x_ef_correction = 0, + x_correction, + x_new; + var y_atmin, y_atmax; + x = x0; + var ACCURACY = 14; + var min_correction_factor = Math.pow(10, -ACCURACY); + var isBounded = typeof min === 'number' && typeof max === 'number'; + + if (isBounded) { + if (min > max) { + throw new Error("newton root finding: min must be greater than max"); + } + + y_atmin = f(min); + y_atmax = f(max); + + if (sign(y_atmin) == sign(y_atmax)) { + throw new Error("newton root finding: y values of bounds must be of opposite sign"); + } + } + + var isEnoughCorrection = function isEnoughCorrection() { + // stop if correction is too small or if correction is in simple loop + return Math.abs(x_correction) <= min_correction_factor * Math.abs(x) || prev_x_ef_correction == x - x_correction - x; + }; + + var i; + + for (i = 0; i < max_iterations; i++) { + dfx = df(x); + + if (dfx == 0) { + if (prev_dfx == 0) { + // error + throw new Error("newton root finding: df(x) is zero"); + } else { + // use previous derivation value + dfx = prev_dfx; + } // or move x a little? + //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15); + + } + + prev_dfx = dfx; + y = f(x); + x_correction = y / dfx; + x_new = x - x_correction; + + if (isEnoughCorrection()) { + break; + } + + if (isBounded) { + if (sign(y) == sign(y_atmax)) { + max = x; + y_atmax = y; + } else if (sign(y) == sign(y_atmin)) { + min = x; + y_atmin = y; + } else { + x = x_new; + break; + } + + if (x_new < min || x_new > max) { + if (sign(y_atmin) == sign(y_atmax)) { + break; + } + + var RATIO_LIMIT = 50; + var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5) + + var dy = y_atmax - y_atmin; + var dx = max - min; + + if (dy == 0) { + x_correction = x - (min + dx * 0.5); + } else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) { + x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET))); + } else { + x_correction = x - (min - y_atmin / dy * dx); + } + + x_new = x - x_correction; + + if (isEnoughCorrection()) { + break; + } + } + } + + prev_x_ef_correction = x - x_new; + x = x_new; + } + + return x; +}; + +{ + module.exports = Polynomial; +} +}); + +var SqrtPolynomial_1 = createCommonjsModule(function (module) { +/** + * + * SqrtPolynomial.js + * + * copyright 2003, 2013 Kevin Lindsey + * + */ +{ + var Polynomial = Polynomial_1; +} +/** + * class variables + */ + + +SqrtPolynomial.VERSION = 1.0; // setup inheritance + +SqrtPolynomial.prototype = new Polynomial(); +SqrtPolynomial.prototype.constructor = SqrtPolynomial; +SqrtPolynomial.superclass = Polynomial.prototype; +/** + * SqrtPolynomial + */ + +function SqrtPolynomial() { + this.init(arguments); +} +/** + * eval + * + * @param {Number} x + * @returns {Number} + */ + + +SqrtPolynomial.prototype.eval = function (x) { + var TOLERANCE = 1e-7; + var result = SqrtPolynomial.superclass.eval.call(this, x); // NOTE: May need to change the following. I added these to capture + // some really small negative values that were being generated by one + // of my Bezier arcLength functions + + if (Math.abs(result) < TOLERANCE) result = 0; + if (result < 0) throw new Error("SqrtPolynomial.eval: cannot take square root of negative number"); + return Math.sqrt(result); +}; + +SqrtPolynomial.prototype.toString = function () { + var result = SqrtPolynomial.superclass.toString.call(this); + return "sqrt(" + result + ")"; +}; + +{ + module.exports = SqrtPolynomial; +} +}); + +// expose classes +var Polynomial = Polynomial_1; + +/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */ +/** + * + * @param {*} o + * @returns {boolean} + */ + +function isNullish(o) { + return o === null || o === undefined; +} +/** + * closePolygon + * + * @param {Array} points + * @returns {Array} + */ + + +function closePolygon(points) { + var copy = points.slice(); + copy.push(points[0]); + return copy; +} +/** + * Intersection + * @class + * @param {string} status + */ + + +function Intersection(status) { + this.init(status); +} +/** + * init + * + * @param {string} status + * @returns {Intersection} + */ + + +Intersection.prototype.init = function (status) { + this.status = status; + this.points = []; +}; +/** + * appendPoint + * + * @param {Point2D} point + */ + + +Intersection.prototype.appendPoint = function (point) { + this.points.push(point); +}; +/** + * appendPoints + * + * @param {Array} points + */ + + +Intersection.prototype.appendPoints = function (points) { + this.points = this.points.concat(points); +}; // static methods + +/** + * intersect + * + * @param {IntersectionArgs} shape1 + * @param {IntersectionArgs} shape2 + * @returns {Intersection} + */ + + +Intersection.intersect = function (shape1, shape2) { + var result; + + if (!isNullish(shape1) && !isNullish(shape2)) { + if (shape1.name === "Path") { + result = Intersection.intersectPathShape(shape1, shape2); + } else if (shape2.name === "Path") { + result = Intersection.intersectPathShape(shape2, shape1); + } else { + var method; + var args; + + if (shape1.name < shape2.name) { + method = "intersect" + shape1.name + shape2.name; + args = shape1.args.concat(shape2.args); + } else { + method = "intersect" + shape2.name + shape1.name; + args = shape2.args.concat(shape1.args); + } + + if (!(method in Intersection)) { + throw new Error("Intersection not available: " + method); + } + + result = Intersection[method].apply(null, args); + } + } else { + result = new Intersection("No Intersection"); + } + + return result; +}; +/** + * intersectPathShape + * + * @param {IntersectionArgs} path + * @param {IntersectionArgs} shape + * @returns {Intersection} + */ + + +Intersection.intersectPathShape = function (path, shape) { + var result = new Intersection("No Intersection"); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = path.args[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var segment = _step.value; + var inter = Intersection.intersect(segment, shape); + result.appendPoints(inter.points); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier2Bezier2 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Bezier2 = function (a1, a2, a3, b1, b2, b3) { + var a, b; + var result = new Intersection("No Intersection"); + a = a2.multiply(-2); + var c12 = a1.add(a.add(a3)); + a = a1.multiply(-2); + b = a2.multiply(2); + var c11 = a.add(b); + var c10 = new Point2D(a1.x, a1.y); + a = b2.multiply(-2); + var c22 = b1.add(a.add(b3)); + a = b1.multiply(-2); + b = b2.multiply(2); + var c21 = a.add(b); + var c20 = new Point2D(b1.x, b1.y); // bezout + + a = c12.x * c11.y - c11.x * c12.y; + b = c22.x * c11.y - c11.x * c22.y; + var c = c21.x * c11.y - c11.x * c21.y; + var d = c11.x * (c10.y - c20.y) + c11.y * (-c10.x + c20.x); + var e = c22.x * c12.y - c12.x * c22.y; + var f = c21.x * c12.y - c12.x * c21.y; + var g = c12.x * (c10.y - c20.y) + c12.y * (-c10.x + c20.x); // determinant + + var poly = new Polynomial(-e * e, -2 * e * f, a * b - f * f - 2 * e * g, a * c - 2 * f * g, a * d - g * g); + var roots = poly.getRoots(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = roots[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var s = _step2.value; + + if (0 <= s && s <= 1) { + var xp = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x); + xp.simplify(); + var xRoots = xp.getRoots(); + var yp = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y); + yp.simplify(); + var yRoots = yp.getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + checkRoots: for (var _iterator3 = xRoots[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var xRoot = _step3.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c22.multiply(s * s).add(c21.multiply(s).add(c20))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier2Bezier3 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @param {Point2D} b4 + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Bezier3 = function (a1, a2, a3, b1, b2, b3, b4) { + var a, b, c, d; + var result = new Intersection("No Intersection"); + a = a2.multiply(-2); + var c12 = a1.add(a.add(a3)); + a = a1.multiply(-2); + b = a2.multiply(2); + var c11 = a.add(b); + var c10 = new Point2D(a1.x, a1.y); + a = b1.multiply(-1); + b = b2.multiply(3); + c = b3.multiply(-3); + d = a.add(b.add(c.add(b4))); + var c23 = new Vector2D(d.x, d.y); + a = b1.multiply(3); + b = b2.multiply(-6); + c = b3.multiply(3); + d = a.add(b.add(c)); + var c22 = new Vector2D(d.x, d.y); + a = b1.multiply(-3); + b = b2.multiply(3); + c = a.add(b); + var c21 = new Vector2D(c.x, c.y); + var c20 = new Vector2D(b1.x, b1.y); + var c10x2 = c10.x * c10.x; + var c10y2 = c10.y * c10.y; + var c11x2 = c11.x * c11.x; + var c11y2 = c11.y * c11.y; + var c12x2 = c12.x * c12.x; + var c12y2 = c12.y * c12.y; + var c20x2 = c20.x * c20.x; + var c20y2 = c20.y * c20.y; + var c21x2 = c21.x * c21.x; + var c21y2 = c21.y * c21.y; + var c22x2 = c22.x * c22.x; + var c22y2 = c22.y * c22.y; + var c23x2 = c23.x * c23.x; + var c23y2 = c23.y * c23.y; + var poly = new Polynomial(-2 * c12.x * c12.y * c23.x * c23.y + c12x2 * c23y2 + c12y2 * c23x2, -2 * c12.x * c12.y * c22.x * c23.y - 2 * c12.x * c12.y * c22.y * c23.x + 2 * c12y2 * c22.x * c23.x + 2 * c12x2 * c22.y * c23.y, -2 * c12.x * c21.x * c12.y * c23.y - 2 * c12.x * c12.y * c21.y * c23.x - 2 * c12.x * c12.y * c22.x * c22.y + 2 * c21.x * c12y2 * c23.x + c12y2 * c22x2 + c12x2 * (2 * c21.y * c23.y + c22y2), 2 * c10.x * c12.x * c12.y * c23.y + 2 * c10.y * c12.x * c12.y * c23.x + c11.x * c11.y * c12.x * c23.y + c11.x * c11.y * c12.y * c23.x - 2 * c20.x * c12.x * c12.y * c23.y - 2 * c12.x * c20.y * c12.y * c23.x - 2 * c12.x * c21.x * c12.y * c22.y - 2 * c12.x * c12.y * c21.y * c22.x - 2 * c10.x * c12y2 * c23.x - 2 * c10.y * c12x2 * c23.y + 2 * c20.x * c12y2 * c23.x + 2 * c21.x * c12y2 * c22.x - c11y2 * c12.x * c23.x - c11x2 * c12.y * c23.y + c12x2 * (2 * c20.y * c23.y + 2 * c21.y * c22.y), 2 * c10.x * c12.x * c12.y * c22.y + 2 * c10.y * c12.x * c12.y * c22.x + c11.x * c11.y * c12.x * c22.y + c11.x * c11.y * c12.y * c22.x - 2 * c20.x * c12.x * c12.y * c22.y - 2 * c12.x * c20.y * c12.y * c22.x - 2 * c12.x * c21.x * c12.y * c21.y - 2 * c10.x * c12y2 * c22.x - 2 * c10.y * c12x2 * c22.y + 2 * c20.x * c12y2 * c22.x - c11y2 * c12.x * c22.x - c11x2 * c12.y * c22.y + c21x2 * c12y2 + c12x2 * (2 * c20.y * c22.y + c21y2), 2 * c10.x * c12.x * c12.y * c21.y + 2 * c10.y * c12.x * c21.x * c12.y + c11.x * c11.y * c12.x * c21.y + c11.x * c11.y * c21.x * c12.y - 2 * c20.x * c12.x * c12.y * c21.y - 2 * c12.x * c20.y * c21.x * c12.y - 2 * c10.x * c21.x * c12y2 - 2 * c10.y * c12x2 * c21.y + 2 * c20.x * c21.x * c12y2 - c11y2 * c12.x * c21.x - c11x2 * c12.y * c21.y + 2 * c12x2 * c20.y * c21.y, -2 * c10.x * c10.y * c12.x * c12.y - c10.x * c11.x * c11.y * c12.y - c10.y * c11.x * c11.y * c12.x + 2 * c10.x * c12.x * c20.y * c12.y + 2 * c10.y * c20.x * c12.x * c12.y + c11.x * c20.x * c11.y * c12.y + c11.x * c11.y * c12.x * c20.y - 2 * c20.x * c12.x * c20.y * c12.y - 2 * c10.x * c20.x * c12y2 + c10.x * c11y2 * c12.x + c10.y * c11x2 * c12.y - 2 * c10.y * c12x2 * c20.y - c20.x * c11y2 * c12.x - c11x2 * c20.y * c12.y + c10x2 * c12y2 + c10y2 * c12x2 + c20x2 * c12y2 + c12x2 * c20y2); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = roots[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var s = _step4.value; + var xRoots = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x).getRoots(); + var yRoots = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y).getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + checkRoots: for (var _iterator5 = xRoots[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var xRoot = _step5.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier2Circle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} c + * @param {number} r + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Circle = function (p1, p2, p3, c, r) { + return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r); +}; +/** + * intersectBezier2Ellipse + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Ellipse = function (p1, p2, p3, ec, rx, ry) { + var a; // temporary variables + // c2, c1, c0; // coefficients of quadratic + + var result = new Intersection("No Intersection"); + a = p2.multiply(-2); + var c2 = p1.add(a.add(p3)); + a = p1.multiply(-2); + var b = p2.multiply(2); + var c1 = a.add(b); + var c0 = new Point2D(p1.x, p1.y); + var rxrx = rx * rx; + var ryry = ry * ry; + var roots = new Polynomial(ryry * c2.x * c2.x + rxrx * c2.y * c2.y, 2 * (ryry * c2.x * c1.x + rxrx * c2.y * c1.y), ryry * (2 * c2.x * c0.x + c1.x * c1.x) + rxrx * (2 * c2.y * c0.y + c1.y * c1.y) - 2 * (ryry * ec.x * c2.x + rxrx * ec.y * c2.y), 2 * (ryry * c1.x * (c0.x - ec.x) + rxrx * c1.y * (c0.y - ec.y)), ryry * (c0.x * c0.x + ec.x * ec.x) + rxrx * (c0.y * c0.y + ec.y * ec.y) - 2 * (ryry * ec.x * c0.x + rxrx * ec.y * c0.y) - rxrx * ryry).getRoots(); + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = roots[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var t = _step6.value; + + if (0 <= t && t <= 1) { + result.points.push(c2.multiply(t * t).add(c1.multiply(t).add(c0))); + } + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier2Line + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Line = function (p1, p2, p3, a1, a2) { + var a; // temporary variables + // let c2, c1, c0; // coefficients of quadratic + // cl; // c coefficient for normal form of line + // n; // normal for normal form of line + + var min = a1.min(a2); // used to determine if point is on line segment + + var max = a1.max(a2); // used to determine if point is on line segment + + var result = new Intersection("No Intersection"); + a = p2.multiply(-2); + var c2 = p1.add(a.add(p3)); + a = p1.multiply(-2); + var b = p2.multiply(2); + var c1 = a.add(b); + var c0 = new Point2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 + // Find normal to line: negative inverse of original line's slope + + var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient + + var cl = a1.x * a2.y - a2.x * a1.y; // Transform cubic coefficients to line's coordinate system and find roots + // of cubic + + var roots = new Polynomial(n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but + // might not be on the line segment. + // Find intersections and calculate point coordinates + + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = roots[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var t = _step7.value; + + if (0 <= t && t <= 1) { + // We're within the Bezier curve + // Find point on Bezier + var p4 = p1.lerp(p2, t); + var p5 = p2.lerp(p3, t); + var p6 = p4.lerp(p5, t); // See if point is on line segment + // Had to make special cases for vertical and horizontal lines due + // to slight errors in calculation of p6 + + if (a1.x == a2.x) { + if (min.y <= p6.y && p6.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } else if (a1.y == a2.y) { + if (min.x <= p6.x && p6.x <= max.x) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + + return result; +}; +/** + * intersectBezier2Polygon + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Polygon = function (p1, p2, p3, points) { + return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points)); +}; +/** + * intersectBezier2Polyline + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Polyline = function (p1, p2, p3, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + var inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier2Rectangle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + +Intersection.intersectBezier2Rectangle = function (p1, p2, p3, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight); + var inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max); + var inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft); + var inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier3Bezier3 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} a4 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @param {Point2D} b4 + * @returns {Intersection} + */ + + +Intersection.intersectBezier3Bezier3 = function (a1, a2, a3, a4, b1, b2, b3, b4) { + var a, b, c, d; // temporary variables + // c13, c12, c11, c10; // coefficients of cubic + // c23, c22, c21, c20; // coefficients of cubic + + var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial + + a = a1.multiply(-1); + b = a2.multiply(3); + c = a3.multiply(-3); + d = a.add(b.add(c.add(a4))); + var c13 = new Vector2D(d.x, d.y); + a = a1.multiply(3); + b = a2.multiply(-6); + c = a3.multiply(3); + d = a.add(b.add(c)); + var c12 = new Vector2D(d.x, d.y); + a = a1.multiply(-3); + b = a2.multiply(3); + c = a.add(b); + var c11 = new Vector2D(c.x, c.y); + var c10 = new Vector2D(a1.x, a1.y); + a = b1.multiply(-1); + b = b2.multiply(3); + c = b3.multiply(-3); + d = a.add(b.add(c.add(b4))); + var c23 = new Vector2D(d.x, d.y); + a = b1.multiply(3); + b = b2.multiply(-6); + c = b3.multiply(3); + d = a.add(b.add(c)); + var c22 = new Vector2D(d.x, d.y); + a = b1.multiply(-3); + b = b2.multiply(3); + c = a.add(b); + var c21 = new Vector2D(c.x, c.y); + var c20 = new Vector2D(b1.x, b1.y); // bezout + + a = c13.x * c12.y - c12.x * c13.y; + b = c13.x * c11.y - c11.x * c13.y; + var c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var c1 = c21.x * c13.y - c13.x * c21.y; + var c2 = c22.x * c13.y - c13.x * c22.y; + var c3 = c23.x * c13.y - c13.x * c23.y; + d = c13.x * c11.y - c11.x * c13.y; + var e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var e1 = c21.x * c13.y - c13.x * c21.y; + var e2 = c22.x * c13.y - c13.x * c22.y; + var e3 = c23.x * c13.y - c13.x * c23.y; + var f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; + var f1 = c21.x * c12.y - c12.x * c21.y; + var f2 = c22.x * c12.y - c12.x * c22.y; + var f3 = c23.x * c12.y - c12.x * c23.y; + var g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var g1 = c21.x * c13.y - c13.x * c21.y; + var g2 = c22.x * c13.y - c13.x * c22.y; + var g3 = c23.x * c13.y - c13.x * c23.y; + var h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; + var h1 = c21.x * c12.y - c12.x * c21.y; + var h2 = c22.x * c12.y - c12.x * c22.y; + var h3 = c23.x * c12.y - c12.x * c23.y; + var i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y; + var i1 = c21.x * c11.y - c11.x * c21.y; + var i2 = c22.x * c11.y - c11.x * c22.y; + var i3 = c23.x * c11.y - c11.x * c23.y; // determinant + + var poly = new Polynomial(-c3 * e3 * g3, -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3, -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3, -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3, -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3, -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3, -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3, -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2, -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1, -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0); + poly.simplify(); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; + + try { + for (var _iterator8 = roots[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var s = _step8.value; + var xp = new Polynomial(c13.x, c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x); + xp.simplify(); + var xRoots = xp.getRoots(); + var yp = new Polynomial(c13.y, c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y); + yp.simplify(); + var yRoots = yp.getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; + + try { + checkRoots: for (var _iterator9 = xRoots[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { + var xRoot = _step9.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError9 = true; + _iteratorError9 = err; + } finally { + try { + if (!_iteratorNormalCompletion9 && _iterator9["return"] != null) { + _iterator9["return"](); + } + } finally { + if (_didIteratorError9) { + throw _iteratorError9; + } + } + } + } + } + } catch (err) { + _didIteratorError8 = true; + _iteratorError8 = err; + } finally { + try { + if (!_iteratorNormalCompletion8 && _iterator8["return"] != null) { + _iterator8["return"](); + } + } finally { + if (_didIteratorError8) { + throw _iteratorError8; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier3Circle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} c + * @param {number} r + * @returns {Intersection} + */ + + +Intersection.intersectBezier3Circle = function (p1, p2, p3, p4, c, r) { + return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r); +}; +/** + * intersectBezier3Ellipse + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + +Intersection.intersectBezier3Ellipse = function (p1, p2, p3, p4, ec, rx, ry) { + var a, b, c, d; // temporary variables + // c3, c2, c1, c0; // coefficients of cubic + + var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial + + a = p1.multiply(-1); + b = p2.multiply(3); + c = p3.multiply(-3); + d = a.add(b.add(c.add(p4))); + var c3 = new Vector2D(d.x, d.y); + a = p1.multiply(3); + b = p2.multiply(-6); + c = p3.multiply(3); + d = a.add(b.add(c)); + var c2 = new Vector2D(d.x, d.y); + a = p1.multiply(-3); + b = p2.multiply(3); + c = a.add(b); + var c1 = new Vector2D(c.x, c.y); + var c0 = new Vector2D(p1.x, p1.y); + var rxrx = rx * rx; + var ryry = ry * ry; + var poly = new Polynomial(c3.x * c3.x * ryry + c3.y * c3.y * rxrx, 2 * (c3.x * c2.x * ryry + c3.y * c2.y * rxrx), 2 * (c3.x * c1.x * ryry + c3.y * c1.y * rxrx) + c2.x * c2.x * ryry + c2.y * c2.y * rxrx, 2 * c3.x * ryry * (c0.x - ec.x) + 2 * c3.y * rxrx * (c0.y - ec.y) + 2 * (c2.x * c1.x * ryry + c2.y * c1.y * rxrx), 2 * c2.x * ryry * (c0.x - ec.x) + 2 * c2.y * rxrx * (c0.y - ec.y) + c1.x * c1.x * ryry + c1.y * c1.y * rxrx, 2 * c1.x * ryry * (c0.x - ec.x) + 2 * c1.y * rxrx * (c0.y - ec.y), c0.x * c0.x * ryry - 2 * c0.y * ec.y * rxrx - 2 * c0.x * ec.x * ryry + c0.y * c0.y * rxrx + ec.x * ec.x * ryry + ec.y * ec.y * rxrx - rxrx * ryry); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion10 = true; + var _didIteratorError10 = false; + var _iteratorError10 = undefined; + + try { + for (var _iterator10 = roots[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { + var t = _step10.value; + result.points.push(c3.multiply(t * t * t).add(c2.multiply(t * t).add(c1.multiply(t).add(c0)))); + } + } catch (err) { + _didIteratorError10 = true; + _iteratorError10 = err; + } finally { + try { + if (!_iteratorNormalCompletion10 && _iterator10["return"] != null) { + _iterator10["return"](); + } + } finally { + if (_didIteratorError10) { + throw _iteratorError10; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier3Line + * + * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough + * sketch of the algorithm used here. Without his help, I'm not sure when I + * would have figured out this intersection problem. + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + +Intersection.intersectBezier3Line = function (p1, p2, p3, p4, a1, a2) { + var a, b, c, d; // temporary variables + // c3, c2, c1, c0; // coefficients of cubic + // cl; // c coefficient for normal form of line + // n; // normal for normal form of line + + var min = a1.min(a2); // used to determine if point is on line segment + + var max = a1.max(a2); // used to determine if point is on line segment + + var result = new Intersection("No Intersection"); // Start with Bezier using Bernstein polynomials for weighting functions: + // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4 + // + // Expand and collect terms to form linear combinations of original Bezier + // controls. This ends up with a vector cubic in t: + // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1 + // /\ /\ /\ /\ + // || || || || + // c3 c2 c1 c0 + // Calculate the coefficients + + a = p1.multiply(-1); + b = p2.multiply(3); + c = p3.multiply(-3); + d = a.add(b.add(c.add(p4))); + var c3 = new Vector2D(d.x, d.y); + a = p1.multiply(3); + b = p2.multiply(-6); + c = p3.multiply(3); + d = a.add(b.add(c)); + var c2 = new Vector2D(d.x, d.y); + a = p1.multiply(-3); + b = p2.multiply(3); + c = a.add(b); + var c1 = new Vector2D(c.x, c.y); + var c0 = new Vector2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 + // Find normal to line: negative inverse of original line's slope + + var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient + + var cl = a1.x * a2.y - a2.x * a1.y; // ?Rotate each cubic coefficient using line for new coordinate system? + // Find roots of rotated cubic + + var roots = new Polynomial(n.dot(c3), n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but + // might not be on the line segment. + // Find intersections and calculate point coordinates + + var _iteratorNormalCompletion11 = true; + var _didIteratorError11 = false; + var _iteratorError11 = undefined; + + try { + for (var _iterator11 = roots[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { + var t = _step11.value; + + if (0 <= t && t <= 1) { + // We're within the Bezier curve + // Find point on Bezier + var p5 = p1.lerp(p2, t); + var p6 = p2.lerp(p3, t); + var p7 = p3.lerp(p4, t); + var p8 = p5.lerp(p6, t); + var p9 = p6.lerp(p7, t); + var p10 = p8.lerp(p9, t); // See if point is on line segment + // Had to make special cases for vertical and horizontal lines due + // to slight errors in calculation of p10 + + if (a1.x == a2.x) { + if (min.y <= p10.y && p10.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } else if (a1.y == a2.y) { + if (min.x <= p10.x && p10.x <= max.x) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } + } + } catch (err) { + _didIteratorError11 = true; + _iteratorError11 = err; + } finally { + try { + if (!_iteratorNormalCompletion11 && _iterator11["return"] != null) { + _iterator11["return"](); + } + } finally { + if (_didIteratorError11) { + throw _iteratorError11; + } + } + } + + return result; +}; +/** + * intersectBezier3Polygon + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectBezier3Polygon = function (p1, p2, p3, p4, points) { + return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points)); +}; +/** + * intersectBezier3Polyline + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectBezier3Polyline = function (p1, p2, p3, p4, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + var inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectBezier3Rectangle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + +Intersection.intersectBezier3Rectangle = function (p1, p2, p3, p4, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight); + var inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max); + var inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft); + var inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectCircleCircle + * + * @param {Point2D} c1 + * @param {number} r1 + * @param {Point2D} c2 + * @param {number} r2 + * @returns {Intersection} + */ + + +Intersection.intersectCircleCircle = function (c1, r1, c2, r2) { + var result; // Determine minimum and maximum radii where circles can intersect + + var r_max = r1 + r2; + var r_min = Math.abs(r1 - r2); // Determine actual distance between circle circles + + var c_dist = c1.distanceFrom(c2); + + if (c_dist > r_max) { + result = new Intersection("Outside"); + } else if (c_dist < r_min) { + result = new Intersection("Inside"); + } else { + result = new Intersection("Intersection"); + var a = (r1 * r1 - r2 * r2 + c_dist * c_dist) / (2 * c_dist); + var h = Math.sqrt(r1 * r1 - a * a); + var p = c1.lerp(c2, a / c_dist); + var b = h / c_dist; + result.points.push(new Point2D(p.x - b * (c2.y - c1.y), p.y + b * (c2.x - c1.x))); + result.points.push(new Point2D(p.x + b * (c2.y - c1.y), p.y - b * (c2.x - c1.x))); + } + + return result; +}; +/** + * intersectCircleEllipse + * + * @param {Point2D} cc + * @param {number} r + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + +Intersection.intersectCircleEllipse = function (cc, r, ec, rx, ry) { + return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry); +}; +/** + * intersectCircleLine + * + * @param {Point2D} c + * @param {number} r + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + +Intersection.intersectCircleLine = function (c, r, a1, a2) { + var result; + var a = (a2.x - a1.x) * (a2.x - a1.x) + (a2.y - a1.y) * (a2.y - a1.y); + var b = 2 * ((a2.x - a1.x) * (a1.x - c.x) + (a2.y - a1.y) * (a1.y - c.y)); + var cc = c.x * c.x + c.y * c.y + a1.x * a1.x + a1.y * a1.y - 2 * (c.x * a1.x + c.y * a1.y) - r * r; + var deter = b * b - 4 * a * cc; + + if (deter < 0) { + result = new Intersection("Outside"); + } else if (deter == 0) { + result = new Intersection("Tangent"); // NOTE: should calculate this point + } else { + var e = Math.sqrt(deter); + var u1 = (-b + e) / (2 * a); + var u2 = (-b - e) / (2 * a); + + if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) { + if (u1 < 0 && u2 < 0 || u1 > 1 && u2 > 1) { + result = new Intersection("Outside"); + } else { + result = new Intersection("Inside"); + } + } else { + result = new Intersection("Intersection"); + + if (0 <= u1 && u1 <= 1) { + result.points.push(a1.lerp(a2, u1)); + } + + if (0 <= u2 && u2 <= 1) { + result.points.push(a1.lerp(a2, u2)); + } + } + } + + return result; +}; +/** + * intersectCirclePolygon + * + * @param {Point2D} c + * @param {number} r + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectCirclePolygon = function (c, r, points) { + return this.intersectCirclePolyline(c, r, closePolygon(points)); +}; +/** + * intersectCirclePolyline + * + * @param {Point2D} c + * @param {number} r + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectCirclePolyline = function (c, r, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + var inter; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + inter = Intersection.intersectCircleLine(c, r, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } else { + result.status = inter.status; + } + + return result; +}; +/** + * intersectCircleRectangle + * + * @param {Point2D} c + * @param {number} r + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + +Intersection.intersectCircleRectangle = function (c, r, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectCircleLine(c, r, min, topRight); + var inter2 = Intersection.intersectCircleLine(c, r, topRight, max); + var inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft); + var inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } else { + result.status = inter1.status; + } + + return result; +}; +/** + * intersectEllipseEllipse + * + * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.magic-software.com + * + * NOTE: Rotation will need to be added to this function + * + * @param {Point2D} c1 + * @param {number} rx1 + * @param {number} ry1 + * @param {Point2D} c2 + * @param {number} rx2 + * @param {number} ry2 + * @returns {Intersection} + */ + + +Intersection.intersectEllipseEllipse = function (c1, rx1, ry1, c2, rx2, ry2) { + var a = [ry1 * ry1, 0, rx1 * rx1, -2 * ry1 * ry1 * c1.x, -2 * rx1 * rx1 * c1.y, ry1 * ry1 * c1.x * c1.x + rx1 * rx1 * c1.y * c1.y - rx1 * rx1 * ry1 * ry1]; + var b = [ry2 * ry2, 0, rx2 * rx2, -2 * ry2 * ry2 * c2.x, -2 * rx2 * rx2 * c2.y, ry2 * ry2 * c2.x * c2.x + rx2 * rx2 * c2.y * c2.y - rx2 * rx2 * ry2 * ry2]; + var yPoly = Intersection.bezout(a, b); + var yRoots = yPoly.getRoots(); + var epsilon = 1e-3; + var norm0 = (a[0] * a[0] + 2 * a[1] * a[1] + a[2] * a[2]) * epsilon; + var norm1 = (b[0] * b[0] + 2 * b[1] * b[1] + b[2] * b[2]) * epsilon; + var result = new Intersection("No Intersection"); + + for (var y = 0; y < yRoots.length; y++) { + var xPoly = new Polynomial(a[0], a[3] + yRoots[y] * a[1], a[5] + yRoots[y] * (a[4] + yRoots[y] * a[2])); + var xRoots = xPoly.getRoots(); + + for (var x = 0; x < xRoots.length; x++) { + var tst = (a[0] * xRoots[x] + a[1] * yRoots[y] + a[3]) * xRoots[x] + (a[2] * yRoots[y] + a[4]) * yRoots[y] + a[5]; + + if (Math.abs(tst) < norm0) { + tst = (b[0] * xRoots[x] + b[1] * yRoots[y] + b[3]) * xRoots[x] + (b[2] * yRoots[y] + b[4]) * yRoots[y] + b[5]; + + if (Math.abs(tst) < norm1) { + result.appendPoint(new Point2D(xRoots[x], yRoots[y])); + } + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectEllipseLine + * + * NOTE: Rotation will need to be added to this function + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + +Intersection.intersectEllipseLine = function (c, rx, ry, a1, a2) { + var result; + var orign = new Vector2D(a1.x, a1.y); + var dir = Vector2D.fromPoints(a1, a2); + var center = new Vector2D(c.x, c.y); + var diff = orign.subtract(center); + var mDir = new Vector2D(dir.x / (rx * rx), dir.y / (ry * ry)); + var mDiff = new Vector2D(diff.x / (rx * rx), diff.y / (ry * ry)); + var a = dir.dot(mDir); + var b = dir.dot(mDiff); + c = diff.dot(mDiff) - 1.0; + var d = b * b - a * c; + + if (d < 0) { + result = new Intersection("Outside"); + } else if (d > 0) { + var root = Math.sqrt(d); // eslint-disable-line no-shadow + + var t_a = (-b - root) / a; + var t_b = (-b + root) / a; + + if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) { + if (t_a < 0 && t_b < 0 || t_a > 1 && t_b > 1) { + result = new Intersection("Outside"); + } else { + result = new Intersection("Inside"); + } + } else { + result = new Intersection("Intersection"); + + if (0 <= t_a && t_a <= 1) { + result.appendPoint(a1.lerp(a2, t_a)); + } + + if (0 <= t_b && t_b <= 1) { + result.appendPoint(a1.lerp(a2, t_b)); + } + } + } else { + var t = -b / a; + + if (0 <= t && t <= 1) { + result = new Intersection("Intersection"); + result.appendPoint(a1.lerp(a2, t)); + } else { + result = new Intersection("Outside"); + } + } + + return result; +}; +/** + * intersectEllipsePolygon + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectEllipsePolygon = function (c, rx, ry, points) { + return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points)); +}; +/** + * intersectEllipsePolyline + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectEllipsePolyline = function (c, rx, ry, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var b1 = points[i]; + var b2 = points[i + 1]; + var inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectEllipseRectangle + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + +Intersection.intersectEllipseRectangle = function (c, rx, ry, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight); + var inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max); + var inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft); + var inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectLineLine + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + +Intersection.intersectLineLine = function (a1, a2, b1, b2) { + var result; + var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + + if (u_b != 0) { + var ua = ua_t / u_b; + var ub = ub_t / u_b; + + if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { + result = new Intersection("Intersection"); + result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); + } else { + result = new Intersection("No Intersection"); + } + } else if (ua_t == 0 || ub_t == 0) { + result = new Intersection("Coincident"); + } else { + result = new Intersection("Parallel"); + } + + return result; +}; +/** + * intersectLinePolygon + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectLinePolygon = function (a1, a2, points) { + return this.intersectLinePolyline(a1, a2, closePolygon(points)); +}; +/** + * intersectLinePolyline + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Array} points + * @returns {Intersection} + */ + + +Intersection.intersectLinePolyline = function (a1, a2, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var b1 = points[i]; + var b2 = points[i + 1]; + var inter = Intersection.intersectLineLine(a1, a2, b1, b2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectLineRectangle + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + +Intersection.intersectLineRectangle = function (a1, a2, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLineLine(min, topRight, a1, a2); + var inter2 = Intersection.intersectLineLine(topRight, max, a1, a2); + var inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2); + var inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectPolygonPolygon + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + +Intersection.intersectPolygonPolygon = function (points1, points2) { + return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2)); +}; +/** + * intersectPolygonPolyline + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + +Intersection.intersectPolygonPolyline = function (points1, points2) { + return this.intersectPolylinePolyline(closePolygon(points1), points2); +}; +/** + * intersectPolygonRectangle + * + * @param {Array} points + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + +Intersection.intersectPolygonRectangle = function (points, r1, r2) { + return this.intersectPolylineRectangle(closePolygon(points), r1, r2); +}; +/** + * intersectPolylinePolyline + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + +Intersection.intersectPolylinePolyline = function (points1, points2) { + var result = new Intersection("No Intersection"); + var len = points1.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points1[i]; + var a2 = points1[i + 1]; + var inter = Intersection.intersectLinePolyline(a1, a2, points2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectPolylineRectangle + * + * @param {Array} points + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + +Intersection.intersectPolylineRectangle = function (points, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLinePolyline(min, topRight, points); + var inter2 = Intersection.intersectLinePolyline(topRight, max, points); + var inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points); + var inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectRectangleRectangle + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + +Intersection.intersectRectangleRectangle = function (a1, a2, b1, b2) { + var min = a1.min(a2); + var max = a1.max(a2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2); + var inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2); + var inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2); + var inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; +}; +/** + * intersectRayRay + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + +Intersection.intersectRayRay = function (a1, a2, b1, b2) { + var result; + var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + + if (u_b != 0) { + var ua = ua_t / u_b; + result = new Intersection("Intersection"); + result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); + } else if (ua_t == 0 || ub_t == 0) { + result = new Intersection("Coincident"); + } else { + result = new Intersection("Parallel"); + } + + return result; +}; +/** + * bezout + * + * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.magic-software.com + * + * @param {Array} e1 + * @param {Array} e2 + * @returns {Polynomial} + */ + + +Intersection.bezout = function (e1, e2) { + var AB = e1[0] * e2[1] - e2[0] * e1[1]; + var AC = e1[0] * e2[2] - e2[0] * e1[2]; + var AD = e1[0] * e2[3] - e2[0] * e1[3]; + var AE = e1[0] * e2[4] - e2[0] * e1[4]; + var AF = e1[0] * e2[5] - e2[0] * e1[5]; + var BC = e1[1] * e2[2] - e2[1] * e1[2]; + var BE = e1[1] * e2[4] - e2[1] * e1[4]; + var BF = e1[1] * e2[5] - e2[1] * e1[5]; + var CD = e1[2] * e2[3] - e2[2] * e1[3]; + var DE = e1[3] * e2[4] - e2[3] * e1[4]; + var DF = e1[3] * e2[5] - e2[3] * e1[5]; + var BFpDE = BF + DE; + var BEmCD = BE - CD; + return new Polynomial(AB * BC - AC * AC, AB * BEmCD + AD * BC - 2 * AC * AE, AB * BFpDE + AD * BEmCD - AE * AE - 2 * AC * AF, AB * DF + AD * BFpDE - 2 * AE * AF, AD * DF - AF * AF); +}; + +/** + * + * IntersectionArgs.js + * + * @copyright 2002, 2017 Kevin Lindsey + * + */ + +/** + * IntersectionArgs + * + * @param {string} name + * @param {Array} args + * @returns {IntersectionArgs} + */ +function IntersectionArgs(name, args) { + this.init(name, args); +} +/** + * init + * + * @param {string} name + * @param {Array} args + */ + + +IntersectionArgs.prototype.init = function (name, args) { + this.name = name; + this.args = args; +}; + +/** + * Shapes + * + * @copyright 2017, Kevin Lindsey + */ +var Shapes = {}; +/** + * quadraticBezier + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @param {number} p3x + * @param {number} p3y + * @returns {IntersectionArgs} + */ + +Shapes.quadraticBezier = function (p1x, p1y, p2x, p2y, p3x, p3y) { + return new IntersectionArgs("Bezier2", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y)]); +}; +/** + * cubicBezier + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @param {number} p3x + * @param {number} p3y + * @param {number} p4x + * @param {number} p4y + * @returns {IntersectionArgs} + */ + + +Shapes.cubicBezier = function (p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { + return new IntersectionArgs("Bezier3", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y), new Point2D(p4x, p4y)]); +}; +/** + * circle + * + * @param {number} centerX + * @param {number} centerY + * @param {number} radius + * @returns {IntersectionArgs} + */ + + +Shapes.circle = function (centerX, centerY, radius) { + return new IntersectionArgs("Circle", [new Point2D(centerX, centerY), radius]); +}; +/** + * ellipse + * + * @param {number} centerX + * @param {number} centerY + * @param {number} radiusX + * @param {number} radiusY + * @returns {IntersectionArgs} + */ + + +Shapes.ellipse = function (centerX, centerY, radiusX, radiusY) { + return new IntersectionArgs("Ellipse", [new Point2D(centerX, centerY), radiusX, radiusY]); +}; +/** + * line + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @returns {IntersectionArgs} + */ + + +Shapes.line = function (p1x, p1y, p2x, p2y) { + return new IntersectionArgs("Line", [new Point2D(p1x, p1y), new Point2D(p2x, p2y)]); +}; +/** + * path + * + * @param {Array} segments + * @returns {IntersectionArgs} + */ + + +Shapes.path = function (segments) { + return new IntersectionArgs("Path", segments); +}; +/** + * polygon + * + * @param {Array} coords + * @returns {IntersectionArgs} + */ + + +Shapes.polygon = function (coords) { + var points = []; + + for (var i = 0; i < coords.length; i += 2) { + points.push(new Point2D(coords[i], coords[i + 1])); + } + + return new IntersectionArgs("Polygon", [points]); +}; +/** + * polyline + * + * @param {Array} coords + * @returns {IntersectionArgs} + */ + + +Shapes.polyline = function (coords) { + var points = []; + + for (var i = 0; i < coords.length; i += 2) { + points.push(new Point2D(coords[i], coords[i + 1])); + } + + return new IntersectionArgs("Polyline", [points]); +}; +/** + * rectangle + * + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + * @returns {IntersectionArgs} + */ + + +Shapes.rectangle = function (x, y, width, height) { + return new IntersectionArgs("Rectangle", [new Point2D(x, y), new Point2D(x + width, y + height)]); +}; + +/** + * AffineShapes + * + * @copyright 2017, Kevin Lindsey + */ +var AffineShapes = {}; +/** + * quadraticBezier + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @returns {IntersectionArgs} + */ + +AffineShapes.quadraticBezier = function (p1, p2, p3) { + return new IntersectionArgs("Bezier2", [p1, p2, p3]); +}; +/** + * cubicBezier + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @returns {IntersectionArgs} + */ + + +AffineShapes.cubicBezier = function (p1, p2, p3, p4) { + return new IntersectionArgs("Bezier3", [p1, p2, p3, p4]); +}; +/** + * circle + * + * @param {Point2D} center + * @param {number} radius + * @returns {IntersectionArgs} + */ + + +AffineShapes.circle = function (center, radius) { + return new IntersectionArgs("Circle", [center, radius]); +}; +/** + * ellipse + * + * @param {Point2D} center + * @param {number} radiusX + * @param {number} radiusY + * @returns {IntersectionArgs} + */ + + +AffineShapes.ellipse = function (center, radiusX, radiusY) { + return new IntersectionArgs("Ellipse", [center, radiusX, radiusY]); +}; +/** + * line + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @returns {IntersectionArgs} + */ + + +AffineShapes.line = function (p1, p2) { + return new IntersectionArgs("Line", [p1, p2]); +}; +/** + * path + * + * @param {Array} segments + * @returns {IntersectionArgs} + */ + + +AffineShapes.path = function (segments) { + return new IntersectionArgs("Path", [segments]); +}; +/** + * polygon + * + * @param {Array} points + * @returns {IntersectionArgs} + */ + + +AffineShapes.polygon = function (points) { + return new IntersectionArgs("Polygon", [points]); +}; +/** + * polyline + * + * @param {Array} points + * @returns {IntersectionArgs} + */ + + +AffineShapes.polyline = function (points) { + return new IntersectionArgs("Polyline", [points]); +}; +/** + * rectangle + * + * @param {Point2D} topLeft + * @param {Vector2D} size + * @returns {IntersectionArgs} + */ + + +AffineShapes.rectangle = function (topLeft, size) { + return new IntersectionArgs("Rectangle", [topLeft, topLeft.add(size)]); +}; + +/** + * + * IntersectionQuery.js + * + * @copyright 2017 Kevin Lindsey + * + */ +/** + * + */ + +var IntersectionQuery = {}; +/** + * pointInCircle + * + * @param {Point2D} point + * @param {Point2D} center + * @param {number} radius + * @returns {boolean} + */ + +IntersectionQuery.pointInCircle = function (point, center, radius) { + var v = Vector2D.fromPoints(center, point); + return v.length() <= radius; +}; +/** + * pointInEllipse + * + * @param {Point2D} point + * @param {Point2D} center + * @param {number} radiusX + * @param {number} radiusY + * @returns {boolean} + */ + + +IntersectionQuery.pointInEllipse = function (point, center, radiusX, radiusY) { + var len = point.subtract(center); + return len.x * len.x / (radiusX * radiusX) + len.y * len.y / (radiusY * radiusY) <= 1; +}; +/** + * pointInPolyline + * + * @param {Point2D} point + * @param {Array} points + */ + + +IntersectionQuery.pointInPolyline = function (point, points) { + var len = points.length; + var counter = 0; + var xInter; + var p1 = points[0]; + + for (var i = 1; i <= len; i++) { + var p2 = points[i % len]; + var minY = Math.min(p1.y, p2.y); + var maxY = Math.max(p1.y, p2.y); + var maxX = Math.max(p1.x, p2.x); + + if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) { + xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x; + + if (p1.x === p2.x || point.x <= xInter) { + counter++; + } + } + + p1 = p2; + } + + return counter % 2 === 1; +}; +/** + * pointInPolyline + * + * @param {Point2D} point + * @param {Array} points + */ + + +IntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline; +/** + * pointInRectangle + * + * @param {Point2D} point + * @param {Point2D} topLeft + * @param {Point2D} bottomRight + * @returns {boolean} + */ + +IntersectionQuery.pointInRectangle = function (point, topLeft, bottomRight) { + return topLeft.x <= point.x && point.x < bottomRight.x && topLeft.y <= point.y && point.y < bottomRight.y; +}; + +// expose module classes + +export { AffineShapes, Intersection, IntersectionArgs, IntersectionQuery, Matrix2D, Point2D, Shapes, Vector2D }; diff --git a/dist/index-esm.min.js b/dist/index-esm.min.js new file mode 100644 index 0000000..d47874a --- /dev/null +++ b/dist/index-esm.min.js @@ -0,0 +1,2 @@ +function t(t,e){return t(e={exports:{}},e.exports),e.exports}var e=t(function(t){function e(t,e){Object.defineProperties(this,{x:{value:void 0!==t?t:0,writable:!1,enumerable:!0,configurable:!1},y:{value:void 0!==e?e:0,writable:!1,enumerable:!0,configurable:!1}})}e.prototype.clone=function(){return new this.constructor(this.x,this.y)},e.prototype.add=function(t){return new this.constructor(this.x+t.x,this.y+t.y)},e.prototype.subtract=function(t){return new this.constructor(this.x-t.x,this.y-t.y)},e.prototype.multiply=function(t){return new this.constructor(this.x*t,this.y*t)},e.prototype.divide=function(t){return new this.constructor(this.x/t,this.y/t)},e.prototype.equals=function(t){return this.x===t.x&&this.y===t.y},e.prototype.precisionEquals=function(t,e){return Math.abs(this.x-t.x)=0;e--)this.coefs.push(t[e]);this._variable="t",this._s=0},e.prototype.eval=function(t){if(isNaN(t))throw new Error("Polynomial.eval: parameter must be a number");for(var e=0,n=this.coefs.length-1;n>=0;n--)e=e*t+this.coefs[n];return e},e.prototype.add=function(t){for(var n=new e,i=this.getDegree(),r=t.getDegree(),s=Math.max(i,r),o=0;o<=s;o++){var a=o<=i?this.coefs[o]:0,y=o<=r?t.coefs[o]:0;n.coefs[o]=a+y}return n},e.prototype.multiply=function(t){for(var n=new e,i=0;i<=this.getDegree()+t.getDegree();i++)n.coefs.push(0);for(i=0;i<=this.getDegree();i++)for(var r=0;r<=t.getDegree();r++)n.coefs[i+r]+=this.coefs[i]*t.coefs[r];return n},e.prototype.divide_scalar=function(t){for(var e=0;e=0&&Math.abs(this.coefs[e])<=t;e--)this.coefs.pop()},e.prototype.bisection=function(t,n){var i,r=this.eval(t),s=this.eval(n);if(Math.abs(r)<=e.TOLERANCE)i=t;else if(Math.abs(s)<=e.TOLERANCE)i=n;else if(r*s<=0)for(var o=Math.log(n-t),a=Math.LN10*e.ACCURACY,y=Math.ceil((o+a)/Math.LN2),u=0;u=0;n--){var i=Math.round(1e3*this.coefs[n])/1e3;if(0!=i){var r=i<0?" - ":" + ";i=Math.abs(i),n>0&&(1==i?i=this._variable:i+=this._variable),n>1&&(i+="^"+n),e.push(r),t.push(i)}}e[0]=" + "==e[0]?"":"-";var s="";for(n=0;n=3&&(s=e.interpolate(r,i,3,o-3,0),Math.abs(s.dy)<=1e-6*s.y)));o++)i[o]=i[o-1],r[o]=.25*r[o-1];return s.y},e.prototype.getDegree=function(){return this.coefs.length-1},e.prototype.getDerivative=function(){for(var t=new e,n=1;n0){for(null!=(n=this.bisection(t,s[0]))&&r.push(n),i=0;i<=s.length-2;i++)null!=(n=this.bisection(s[i],s[i+1]))&&r.push(n);null!=(n=this.bisection(s[s.length-1],e))&&r.push(n)}else null!=(n=this.bisection(t,e))&&r.push(n)}return r},e.prototype.getLinearRoot=function(){var t=[],e=this.coefs[1];return 0!=e&&t.push(-this.coefs[0]/e),t},e.prototype.getQuadraticRoots=function(){var t=[];if(2==this.getDegree()){var e=this.coefs[2],n=this.coefs[1]/e,i=n*n-4*(this.coefs[0]/e);if(i>0){var r=Math.sqrt(i);t.push(.5*(-n+r)),t.push(.5*(-n-r))}else 0==i&&t.push(.5*-n)}return t},e.prototype.getCubicRoots=function(){var t=[];if(3==this.getDegree()){var e=this.coefs[3],n=this.coefs[2]/e,i=this.coefs[1]/e,r=(3*i-n*n)/3,s=(2*n*n*n-9*i*n+27*(this.coefs[0]/e))/27,o=n/3,a=s*s/4+r*r*r/27,y=s/2,u=this.zeroErrorEstimate();if(Math.abs(a)<=u&&(a=0),a>0){var c,h=Math.sqrt(a);c=(v=-y+h)>=0?Math.pow(v,1/3):-Math.pow(-v,1/3),(v=-y-h)>=0?c+=Math.pow(v,1/3):c-=Math.pow(-v,1/3),t.push(c-o)}else if(a<0){var l=Math.sqrt(-r/3),p=Math.atan2(Math.sqrt(-a),-y)/3,x=Math.cos(p),f=Math.sin(p),d=Math.sqrt(3);t.push(2*l*x-o),t.push(-l*(x+d*f)-o),t.push(-l*(x-d*f)-o)}else{var v;v=y>=0?-Math.pow(y,1/3):Math.pow(-y,1/3),t.push(2*v-o),t.push(-v-o)}}return t};var n=function(t){return"number"==typeof t?t?t<0?-1:1:t==t?t:NaN:NaN};e.prototype.getQuarticRoots=function(){var t=[],i=this.getDegree();if(4==i){var r=new e;r.coefs=this.coefs.slice(),r.divide_scalar(r.coefs[i]);Math.abs(r.coefs[0])<10*1e-15*Math.abs(r.coefs[3])&&(r.coefs[0]=0);var s,o=r.getDerivative(),a=o.getRoots().sort(function(t,e){return t-e}),y=[],u=a.length-1,c=this.bounds();maxabsX=Math.max(Math.abs(c.minX),Math.abs(c.maxX));var h=this.zeroErrorEstimate(maxabsX);for(s=0;s<=u;s++)y.push(r.eval(a[s]));for(s=0;s<=u;s++)Math.abs(y[s])-1){for(0!=y[0]?n(y[0])!=n(r.eval(a[0]-l)-y[0])&&(p.push(a[0]-l),x.push([c.minX,a[0]])):(t.push(a[0],a[0]),s++);s0)for(s=0;se?s:e},0)},e.prototype.bounds_UpperReal_Fujiwara=function(){var t=this.coefs,e=t.length-1,n=t[e];1!=n&&(t=this.coefs.map(function(t){return t/n}));var i,r=t.map(function(t,n){return n0)},{negX:-2*r.reduce(s,{max:0,nearmax:0}).max,posX:2*o.max}},e.prototype.bounds_LowerReal_Fujiwara=function(){var t=new e;t.coefs=this.coefs.slice().reverse();var n=t.bounds_UpperReal_Fujiwara();return n.negX=1/n.negX,n.posX=1/n.posX,n},e.prototype.bounds=function(){var t=this.bounds_UpperReal_Fujiwara(),e={minX:t.negX,maxX:t.posX};return 0===t.negX&&0===t.posX?e:(0===t.negX?e.minX=this.bounds_LowerReal_Fujiwara().posX:0===t.posX&&(e.maxX=this.bounds_LowerReal_Fujiwara().negX),e.minX>e.maxX&&(e.minX=e.maxX=0),e)},e.newton_secant_bisection=function(t,e,i,r,s,o){var a,u,c,h,l,p,x=0,f=0;a=t;var d=Math.pow(10,-14),v="number"==typeof s&&"number"==typeof o;if(v){if(s>o)throw new Error("newton root finding: min must be greater than max");if(l=e(s),p=e(o),n(l)==n(p))throw new Error("newton root finding: y values of bounds must be of opposite sign")}var w,m=function(){return Math.abs(c)<=d*Math.abs(a)||f==a-c-a};for(w=0;wo){if(n(l)==n(p))break;var g=p-l,b=o-s;if(c=0==g?a-(s+.5*b):Math.abs(g/Math.min(l,p))>50?a-(s+b*(.5+(Math.abs(l)0&&(n.status="Intersection"),n},p.intersectBezier2Bezier2=function(t,e,n,i,r,o){var a,y,u=new p("No Intersection");a=e.multiply(-2);var h=t.add(a.add(n));a=t.multiply(-2),y=e.multiply(2);var l=a.add(y),x=new s(t.x,t.y);a=r.multiply(-2);var f=i.add(a.add(o));a=i.multiply(-2),y=r.multiply(2);var d=a.add(y),v=new s(i.x,i.y);a=h.x*l.y-l.x*h.y,y=f.x*l.y-l.x*f.y;var w=d.x*l.y-l.x*d.y,m=l.x*(x.y-v.y)+l.y*(-x.x+v.x),g=f.x*h.y-h.x*f.y,b=d.x*h.y-h.x*d.y,P=h.x*(x.y-v.y)+h.y*(-x.x+v.x),M=new c(-g*g,-2*g*b,a*y-b*b-2*g*P,a*w-2*b*P,a*m-P*P).getRoots(),I=!0,N=!1,L=void 0;try{for(var R,E=M[Symbol.iterator]();!(I=(R=E.next()).done);I=!0){var z=R.value;if(0<=z&&z<=1){var B=new c(h.x,l.x,x.x-v.x-z*d.x-z*z*f.x);B.simplify();var X=B.getRoots(),C=new c(h.y,l.y,x.y-v.y-z*d.y-z*z*f.y);C.simplify();var _=C.getRoots();if(X.length>0&&_.length>0){var S=!0,q=!1,A=void 0;try{t:for(var D,k=X[Symbol.iterator]();!(S=(D=k.next()).done);S=!0){var O=D.value;if(0<=O&&O<=1)for(var T=0;T<_.length;T++)if(Math.abs(O-_[T])<1e-4){u.points.push(f.multiply(z*z).add(d.multiply(z).add(v)));break t}}}catch(t){q=!0,A=t}finally{try{S||null==k.return||k.return()}finally{if(q)throw A}}}}}}catch(t){N=!0,L=t}finally{try{I||null==E.return||E.return()}finally{if(N)throw L}}return u.points.length>0&&(u.status="Intersection"),u},p.intersectBezier2Bezier3=function(t,e,n,i,r,a,y){var u,h,l,x,f=new p("No Intersection");u=e.multiply(-2);var d=t.add(u.add(n));u=t.multiply(-2),h=e.multiply(2);var v=u.add(h),w=new s(t.x,t.y);u=i.multiply(-1),h=r.multiply(3),l=a.multiply(-3),x=u.add(h.add(l.add(y)));var m=new o(x.x,x.y);u=i.multiply(3),h=r.multiply(-6),l=a.multiply(3),x=u.add(h.add(l));var g=new o(x.x,x.y);u=i.multiply(-3),h=r.multiply(3),l=u.add(h);var b=new o(l.x,l.y),P=new o(i.x,i.y),M=w.x*w.x,I=w.y*w.y,N=v.x*v.x,L=v.y*v.y,R=d.x*d.x,E=d.y*d.y,z=P.x*P.x,B=P.y*P.y,X=b.x*b.x,C=b.y*b.y,_=g.x*g.x,S=g.y*g.y,q=m.x*m.x,A=m.y*m.y,D=new c(-2*d.x*d.y*m.x*m.y+R*A+E*q,-2*d.x*d.y*g.x*m.y-2*d.x*d.y*g.y*m.x+2*E*g.x*m.x+2*R*g.y*m.y,-2*d.x*b.x*d.y*m.y-2*d.x*d.y*b.y*m.x-2*d.x*d.y*g.x*g.y+2*b.x*E*m.x+E*_+R*(2*b.y*m.y+S),2*w.x*d.x*d.y*m.y+2*w.y*d.x*d.y*m.x+v.x*v.y*d.x*m.y+v.x*v.y*d.y*m.x-2*P.x*d.x*d.y*m.y-2*d.x*P.y*d.y*m.x-2*d.x*b.x*d.y*g.y-2*d.x*d.y*b.y*g.x-2*w.x*E*m.x-2*w.y*R*m.y+2*P.x*E*m.x+2*b.x*E*g.x-L*d.x*m.x-N*d.y*m.y+R*(2*P.y*m.y+2*b.y*g.y),2*w.x*d.x*d.y*g.y+2*w.y*d.x*d.y*g.x+v.x*v.y*d.x*g.y+v.x*v.y*d.y*g.x-2*P.x*d.x*d.y*g.y-2*d.x*P.y*d.y*g.x-2*d.x*b.x*d.y*b.y-2*w.x*E*g.x-2*w.y*R*g.y+2*P.x*E*g.x-L*d.x*g.x-N*d.y*g.y+X*E+R*(2*P.y*g.y+C),2*w.x*d.x*d.y*b.y+2*w.y*d.x*b.x*d.y+v.x*v.y*d.x*b.y+v.x*v.y*b.x*d.y-2*P.x*d.x*d.y*b.y-2*d.x*P.y*b.x*d.y-2*w.x*b.x*E-2*w.y*R*b.y+2*P.x*b.x*E-L*d.x*b.x-N*d.y*b.y+2*R*P.y*b.y,-2*w.x*w.y*d.x*d.y-w.x*v.x*v.y*d.y-w.y*v.x*v.y*d.x+2*w.x*d.x*P.y*d.y+2*w.y*P.x*d.x*d.y+v.x*P.x*v.y*d.y+v.x*v.y*d.x*P.y-2*P.x*d.x*P.y*d.y-2*w.x*P.x*E+w.x*L*d.x+w.y*N*d.y-2*w.y*R*P.y-P.x*L*d.x-N*P.y*d.y+M*E+I*R+z*E+R*B).getRootsInInterval(0,1),k=!0,O=!1,T=void 0;try{for(var j,F=D[Symbol.iterator]();!(k=(j=F.next()).done);k=!0){var U=j.value,Y=new c(d.x,v.x,w.x-P.x-U*b.x-U*U*g.x-U*U*U*m.x).getRoots(),Q=new c(d.y,v.y,w.y-P.y-U*b.y-U*U*g.y-U*U*U*m.y).getRoots();if(Y.length>0&&Q.length>0){var V=!0,G=!1,H=void 0;try{t:for(var J,K=Y[Symbol.iterator]();!(V=(J=K.next()).done);V=!0){var W=J.value;if(0<=W&&W<=1)for(var Z=0;Z0&&(f.status="Intersection"),f},p.intersectBezier2Circle=function(t,e,n,i,r){return p.intersectBezier2Ellipse(t,e,n,i,r,r)},p.intersectBezier2Ellipse=function(t,e,n,i,r,o){var a,y=new p("No Intersection");a=e.multiply(-2);var u=t.add(a.add(n));a=t.multiply(-2);var h=e.multiply(2),l=a.add(h),x=new s(t.x,t.y),f=r*r,d=o*o,v=new c(d*u.x*u.x+f*u.y*u.y,2*(d*u.x*l.x+f*u.y*l.y),d*(2*u.x*x.x+l.x*l.x)+f*(2*u.y*x.y+l.y*l.y)-2*(d*i.x*u.x+f*i.y*u.y),2*(d*l.x*(x.x-i.x)+f*l.y*(x.y-i.y)),d*(x.x*x.x+i.x*i.x)+f*(x.y*x.y+i.y*i.y)-2*(d*i.x*x.x+f*i.y*x.y)-f*d).getRoots(),w=!0,m=!1,g=void 0;try{for(var b,P=v[Symbol.iterator]();!(w=(b=P.next()).done);w=!0){var M=b.value;0<=M&&M<=1&&y.points.push(u.multiply(M*M).add(l.multiply(M).add(x)))}}catch(t){m=!0,g=t}finally{try{w||null==P.return||P.return()}finally{if(m)throw g}}return y.points.length>0&&(y.status="Intersection"),y},p.intersectBezier2Line=function(t,e,n,i,r){var a,y=i.min(r),u=i.max(r),h=new p("No Intersection");a=e.multiply(-2);var l=t.add(a.add(n));a=t.multiply(-2);var x=e.multiply(2),f=a.add(x),d=new s(t.x,t.y),v=new o(i.y-r.y,r.x-i.x),w=i.x*r.y-r.x*i.y,m=new c(v.dot(l),v.dot(f),v.dot(d)+w).getRoots(),g=!0,b=!1,P=void 0;try{for(var M,I=m[Symbol.iterator]();!(g=(M=I.next()).done);g=!0){var N=M.value;if(0<=N&&N<=1){var L=t.lerp(e,N),R=e.lerp(n,N),E=L.lerp(R,N);i.x==r.x?y.y<=E.y&&E.y<=u.y&&(h.status="Intersection",h.appendPoint(E)):i.y==r.y?y.x<=E.x&&E.x<=u.x&&(h.status="Intersection",h.appendPoint(E)):y.x<=E.x&&E.x<=u.x&&y.y<=E.y&&E.y<=u.y&&(h.status="Intersection",h.appendPoint(E))}}}catch(t){b=!0,P=t}finally{try{g||null==I.return||I.return()}finally{if(b)throw P}}return h},p.intersectBezier2Polygon=function(t,e,n,i){return p.intersectBezier2Polyline(t,e,n,l(i))},p.intersectBezier2Polyline=function(t,e,n,i){for(var r=new p("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},p.intersectBezier2Rectangle=function(t,e,n,i,r){var o=i.min(r),a=i.max(r),y=new s(a.x,o.y),u=new s(o.x,a.y),c=p.intersectBezier2Line(t,e,n,o,y),h=p.intersectBezier2Line(t,e,n,y,a),l=p.intersectBezier2Line(t,e,n,a,u),x=p.intersectBezier2Line(t,e,n,u,o),f=new p("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(x.points),f.points.length>0&&(f.status="Intersection"),f},p.intersectBezier3Bezier3=function(t,e,n,i,r,s,a,y){var u,h,l,x,f=new p("No Intersection");u=t.multiply(-1),h=e.multiply(3),l=n.multiply(-3),x=u.add(h.add(l.add(i)));var d=new o(x.x,x.y);u=t.multiply(3),h=e.multiply(-6),l=n.multiply(3),x=u.add(h.add(l));var v=new o(x.x,x.y);u=t.multiply(-3),h=e.multiply(3),l=u.add(h);var w=new o(l.x,l.y),m=new o(t.x,t.y);u=r.multiply(-1),h=s.multiply(3),l=a.multiply(-3),x=u.add(h.add(l.add(y)));var g=new o(x.x,x.y);u=r.multiply(3),h=s.multiply(-6),l=a.multiply(3),x=u.add(h.add(l));var b=new o(x.x,x.y);u=r.multiply(-3),h=s.multiply(3),l=u.add(h);var P=new o(l.x,l.y),M=new o(r.x,r.y);u=d.x*v.y-v.x*d.y,h=d.x*w.y-w.x*d.y;var I=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,N=P.x*d.y-d.x*P.y,L=b.x*d.y-d.x*b.y,R=g.x*d.y-d.x*g.y;x=d.x*w.y-w.x*d.y;var E=d.x*m.y+v.x*w.y-w.x*v.y-m.x*d.y+M.x*d.y-d.x*M.y,z=P.x*d.y-d.x*P.y,B=b.x*d.y-d.x*b.y,X=g.x*d.y-d.x*g.y,C=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,_=P.x*v.y-v.x*P.y,S=b.x*v.y-v.x*b.y,q=g.x*v.y-v.x*g.y,A=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,D=P.x*d.y-d.x*P.y,k=b.x*d.y-d.x*b.y,O=g.x*d.y-d.x*g.y,T=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,j=P.x*v.y-v.x*P.y,F=b.x*v.y-v.x*b.y,U=g.x*v.y-v.x*g.y,Y=w.x*m.y-m.x*w.y+M.x*w.y-w.x*M.y,Q=P.x*w.y-w.x*P.y,V=b.x*w.y-w.x*b.y,G=g.x*w.y-w.x*g.y,H=new c(-R*X*O,-R*X*k-R*B*O-L*X*O,-R*X*D-R*B*k-L*X*k-R*z*O-L*B*O-N*X*O,-R*X*A-R*B*D-L*X*D-R*z*k-L*B*k-N*X*k-R*E*O-L*z*O-N*B*O-I*X*O+h*q*O+R*x*U-u*q*U+u*X*G,-R*B*A-L*X*A-R*z*D-L*B*D-N*X*D-R*E*k-L*z*k-N*B*k-I*X*k+h*q*k-L*E*O-N*z*O-I*B*O+h*S*O+R*x*F-u*q*F+L*x*U-u*S*U+u*X*V+u*B*G,-R*z*A-L*B*A-N*X*A-R*E*D-L*z*D-N*B*D-I*X*D+h*q*D-L*E*k-N*z*k-I*B*k+h*S*k-N*E*O-I*z*O+h*_*O+R*x*j-u*q*j+L*x*F-u*S*F+N*x*U-u*_*U+u*X*Q+u*B*V+u*z*G,-R*E*A-L*z*A-N*B*A-I*X*A+h*q*A-L*E*D-N*z*D-I*B*D+h*S*D-N*E*k-I*z*k+h*_*k-I*E*O+h*C*O+R*x*T-u*q*T+L*x*j-u*S*j+N*x*F-u*_*F+I*x*U-u*C*U+u*X*Y+u*B*Q+u*z*V-h*x*G+u*E*G,-L*E*A-N*z*A-I*B*A+h*S*A-N*E*D-I*z*D+h*_*D-I*E*k+h*C*k+L*x*T-u*S*T+N*x*j-u*_*j+I*x*F-u*C*F+u*B*Y+u*z*Q-h*x*V+u*E*V,-N*E*A-I*z*A+h*_*A-I*E*D+h*C*D+N*x*T-u*_*T+I*x*j-u*C*j+u*z*Y-h*x*Q+u*E*Q,-I*E*A+h*C*A+I*x*T-u*C*T-h*x*Y+u*E*Y);H.simplify();var J=H.getRootsInInterval(0,1),K=!0,W=!1,Z=void 0;try{for(var $,tt=J[Symbol.iterator]();!(K=($=tt.next()).done);K=!0){var et=$.value,nt=new c(d.x,v.x,w.x,m.x-M.x-et*P.x-et*et*b.x-et*et*et*g.x);nt.simplify();var it=nt.getRoots(),rt=new c(d.y,v.y,w.y,m.y-M.y-et*P.y-et*et*b.y-et*et*et*g.y);rt.simplify();var st=rt.getRoots();if(it.length>0&&st.length>0){var ot=!0,at=!1,yt=void 0;try{t:for(var ut,ct=it[Symbol.iterator]();!(ot=(ut=ct.next()).done);ot=!0){var ht=ut.value;if(0<=ht&&ht<=1)for(var lt=0;lt0&&(f.status="Intersection"),f},p.intersectBezier3Circle=function(t,e,n,i,r,s){return p.intersectBezier3Ellipse(t,e,n,i,r,s,s)},p.intersectBezier3Ellipse=function(t,e,n,i,r,s,a){var y,u,h,l,x=new p("No Intersection");y=t.multiply(-1),u=e.multiply(3),h=n.multiply(-3),l=y.add(u.add(h.add(i)));var f=new o(l.x,l.y);y=t.multiply(3),u=e.multiply(-6),h=n.multiply(3),l=y.add(u.add(h));var d=new o(l.x,l.y);y=t.multiply(-3),u=e.multiply(3),h=y.add(u);var v=new o(h.x,h.y),w=new o(t.x,t.y),m=s*s,g=a*a,b=new c(f.x*f.x*g+f.y*f.y*m,2*(f.x*d.x*g+f.y*d.y*m),2*(f.x*v.x*g+f.y*v.y*m)+d.x*d.x*g+d.y*d.y*m,2*f.x*g*(w.x-r.x)+2*f.y*m*(w.y-r.y)+2*(d.x*v.x*g+d.y*v.y*m),2*d.x*g*(w.x-r.x)+2*d.y*m*(w.y-r.y)+v.x*v.x*g+v.y*v.y*m,2*v.x*g*(w.x-r.x)+2*v.y*m*(w.y-r.y),w.x*w.x*g-2*w.y*r.y*m-2*w.x*r.x*g+w.y*w.y*m+r.x*r.x*g+r.y*r.y*m-m*g).getRootsInInterval(0,1),P=!0,M=!1,I=void 0;try{for(var N,L=b[Symbol.iterator]();!(P=(N=L.next()).done);P=!0){var R=N.value;x.points.push(f.multiply(R*R*R).add(d.multiply(R*R).add(v.multiply(R).add(w))))}}catch(t){M=!0,I=t}finally{try{P||null==L.return||L.return()}finally{if(M)throw I}}return x.points.length>0&&(x.status="Intersection"),x},p.intersectBezier3Line=function(t,e,n,i,r,s){var a,y,u,h,l=r.min(s),x=r.max(s),f=new p("No Intersection");a=t.multiply(-1),y=e.multiply(3),u=n.multiply(-3),h=a.add(y.add(u.add(i)));var d=new o(h.x,h.y);a=t.multiply(3),y=e.multiply(-6),u=n.multiply(3),h=a.add(y.add(u));var v=new o(h.x,h.y);a=t.multiply(-3),y=e.multiply(3),u=a.add(y);var w=new o(u.x,u.y),m=new o(t.x,t.y),g=new o(r.y-s.y,s.x-r.x),b=r.x*s.y-s.x*r.y,P=new c(g.dot(d),g.dot(v),g.dot(w),g.dot(m)+b).getRoots(),M=!0,I=!1,N=void 0;try{for(var L,R=P[Symbol.iterator]();!(M=(L=R.next()).done);M=!0){var E=L.value;if(0<=E&&E<=1){var z=t.lerp(e,E),B=e.lerp(n,E),X=n.lerp(i,E),C=z.lerp(B,E),_=B.lerp(X,E),S=C.lerp(_,E);r.x==s.x?l.y<=S.y&&S.y<=x.y&&(f.status="Intersection",f.appendPoint(S)):r.y==s.y?l.x<=S.x&&S.x<=x.x&&(f.status="Intersection",f.appendPoint(S)):l.x<=S.x&&S.x<=x.x&&l.y<=S.y&&S.y<=x.y&&(f.status="Intersection",f.appendPoint(S))}}}catch(t){I=!0,N=t}finally{try{M||null==R.return||R.return()}finally{if(I)throw N}}return f},p.intersectBezier3Polygon=function(t,e,n,i,r){return this.intersectBezier3Polyline(t,e,n,i,l(r))},p.intersectBezier3Polyline=function(t,e,n,i,r){for(var s=new p("No Intersection"),o=r.length,a=0;a0&&(s.status="Intersection"),s},p.intersectBezier3Rectangle=function(t,e,n,i,r,o){var a=r.min(o),y=r.max(o),u=new s(y.x,a.y),c=new s(a.x,y.y),h=p.intersectBezier3Line(t,e,n,i,a,u),l=p.intersectBezier3Line(t,e,n,i,u,y),x=p.intersectBezier3Line(t,e,n,i,y,c),f=p.intersectBezier3Line(t,e,n,i,c,a),d=new p("No Intersection");return d.appendPoints(h.points),d.appendPoints(l.points),d.appendPoints(x.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d},p.intersectCircleCircle=function(t,e,n,i){var r,o=e+i,a=Math.abs(e-i),y=t.distanceFrom(n);if(y>o)r=new p("Outside");else if(y1)&&(c<0||c>1)?r=new p(u<0&&c<0||u>1&&c>1?"Outside":"Inside"):(r=new p("Intersection"),0<=u&&u<=1&&r.points.push(n.lerp(i,u)),0<=c&&c<=1&&r.points.push(n.lerp(i,c)))}return r},p.intersectCirclePolygon=function(t,e,n){return this.intersectCirclePolyline(t,e,l(n))},p.intersectCirclePolyline=function(t,e,n){for(var i,r=new p("No Intersection"),s=n.length,o=0;o0?r.status="Intersection":r.status=i.status,r},p.intersectCircleRectangle=function(t,e,n,i){var r=n.min(i),o=n.max(i),a=new s(o.x,r.y),y=new s(r.x,o.y),u=p.intersectCircleLine(t,e,r,a),c=p.intersectCircleLine(t,e,a,o),h=p.intersectCircleLine(t,e,o,y),l=p.intersectCircleLine(t,e,y,r),x=new p("No Intersection");return x.appendPoints(u.points),x.appendPoints(c.points),x.appendPoints(h.points),x.appendPoints(l.points),x.points.length>0?x.status="Intersection":x.status=u.status,x},p.intersectEllipseEllipse=function(t,e,n,i,r,o){for(var a=[n*n,0,e*e,-2*n*n*t.x,-2*e*e*t.y,n*n*t.x*t.x+e*e*t.y*t.y-e*e*n*n],y=[o*o,0,r*r,-2*o*o*i.x,-2*r*r*i.y,o*o*i.x*i.x+r*r*i.y*i.y-r*r*o*o],u=p.bezout(a,y).getRoots(),h=.001*(a[0]*a[0]+2*a[1]*a[1]+a[2]*a[2]),l=.001*(y[0]*y[0]+2*y[1]*y[1]+y[2]*y[2]),x=new p("No Intersection"),f=0;f0&&(x.status="Intersection"),x},p.intersectEllipseLine=function(t,e,n,i,r){var s,a=new o(i.x,i.y),y=o.fromPoints(i,r),u=new o(t.x,t.y),c=a.subtract(u),h=new o(y.x/(e*e),y.y/(n*n)),l=new o(c.x/(e*e),c.y/(n*n)),x=y.dot(h),f=y.dot(l),d=f*f-x*(t=c.dot(l)-1);if(d<0)s=new p("Outside");else if(d>0){var v=Math.sqrt(d),w=(-f-v)/x,m=(-f+v)/x;(w<0||11&&m>1?"Outside":"Inside"):(s=new p("Intersection"),0<=w&&w<=1&&s.appendPoint(i.lerp(r,w)),0<=m&&m<=1&&s.appendPoint(i.lerp(r,m)))}else{var g=-f/x;0<=g&&g<=1?(s=new p("Intersection")).appendPoint(i.lerp(r,g)):s=new p("Outside")}return s},p.intersectEllipsePolygon=function(t,e,n,i){return this.intersectEllipsePolyline(t,e,n,l(i))},p.intersectEllipsePolyline=function(t,e,n,i){for(var r=new p("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},p.intersectEllipseRectangle=function(t,e,n,i,r){var o=i.min(r),a=i.max(r),y=new s(a.x,o.y),u=new s(o.x,a.y),c=p.intersectEllipseLine(t,e,n,o,y),h=p.intersectEllipseLine(t,e,n,y,a),l=p.intersectEllipseLine(t,e,n,a,u),x=p.intersectEllipseLine(t,e,n,u,o),f=new p("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(x.points),f.points.length>0&&(f.status="Intersection"),f},p.intersectLineLine=function(t,e,n,i){var r,o=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=o/y,c=a/y;0<=u&&u<=1&&0<=c&&c<=1?(r=new p("Intersection")).points.push(new s(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y))):r=new p("No Intersection")}else r=new p(0==o||0==a?"Coincident":"Parallel");return r},p.intersectLinePolygon=function(t,e,n){return this.intersectLinePolyline(t,e,l(n))},p.intersectLinePolyline=function(t,e,n){for(var i=new p("No Intersection"),r=n.length,s=0;s0&&(i.status="Intersection"),i},p.intersectLineRectangle=function(t,e,n,i){var r=n.min(i),o=n.max(i),a=new s(o.x,r.y),y=new s(r.x,o.y),u=p.intersectLineLine(r,a,t,e),c=p.intersectLineLine(a,o,t,e),h=p.intersectLineLine(o,y,t,e),l=p.intersectLineLine(y,r,t,e),x=new p("No Intersection");return x.appendPoints(u.points),x.appendPoints(c.points),x.appendPoints(h.points),x.appendPoints(l.points),x.points.length>0&&(x.status="Intersection"),x},p.intersectPolygonPolygon=function(t,e){return this.intersectPolylinePolyline(l(t),l(e))},p.intersectPolygonPolyline=function(t,e){return this.intersectPolylinePolyline(l(t),e)},p.intersectPolygonRectangle=function(t,e,n){return this.intersectPolylineRectangle(l(t),e,n)},p.intersectPolylinePolyline=function(t,e){for(var n=new p("No Intersection"),i=t.length,r=0;r0&&(n.status="Intersection"),n},p.intersectPolylineRectangle=function(t,e,n){var i=e.min(n),r=e.max(n),o=new s(r.x,i.y),a=new s(i.x,r.y),y=p.intersectLinePolyline(i,o,t),u=p.intersectLinePolyline(o,r,t),c=p.intersectLinePolyline(r,a,t),h=p.intersectLinePolyline(a,i,t),l=new p("No Intersection");return l.appendPoints(y.points),l.appendPoints(u.points),l.appendPoints(c.points),l.appendPoints(h.points),l.points.length>0&&(l.status="Intersection"),l},p.intersectRectangleRectangle=function(t,e,n,i){var r=t.min(e),o=t.max(e),a=new s(o.x,r.y),y=new s(r.x,o.y),u=p.intersectLineRectangle(r,a,n,i),c=p.intersectLineRectangle(a,o,n,i),h=p.intersectLineRectangle(o,y,n,i),l=p.intersectLineRectangle(y,r,n,i),x=new p("No Intersection");return x.appendPoints(u.points),x.appendPoints(c.points),x.appendPoints(h.points),x.appendPoints(l.points),x.points.length>0&&(x.status="Intersection"),x},p.intersectRayRay=function(t,e,n,i){var r,o=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=o/y;(r=new p("Intersection")).points.push(new s(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y)))}else r=new p(0==o||0==a?"Coincident":"Parallel");return r},p.bezout=function(t,e){var n=t[0]*e[1]-e[0]*t[1],i=t[0]*e[2]-e[0]*t[2],r=t[0]*e[3]-e[0]*t[3],s=t[0]*e[4]-e[0]*t[4],o=t[0]*e[5]-e[0]*t[5],a=t[1]*e[2]-e[1]*t[2],y=t[1]*e[4]-e[1]*t[4],u=t[1]*e[5]-e[1]*t[5],h=t[2]*e[3]-e[2]*t[3],l=t[3]*e[4]-e[3]*t[4],p=t[3]*e[5]-e[3]*t[5],x=u+l,f=y-h;return new c(n*a-i*i,n*f+r*a-2*i*s,n*x+r*f-s*s-2*i*o,n*p+r*x-2*s*o,r*p-o*o)},x.prototype.init=function(t,e){this.name=t,this.args=e};var f={quadraticBezier:function(t,e,n,i,r,o){return new x("Bezier2",[new s(t,e),new s(n,i),new s(r,o)])},cubicBezier:function(t,e,n,i,r,o,a,y){return new x("Bezier3",[new s(t,e),new s(n,i),new s(r,o),new s(a,y)])},circle:function(t,e,n){return new x("Circle",[new s(t,e),n])},ellipse:function(t,e,n,i){return new x("Ellipse",[new s(t,e),n,i])},line:function(t,e,n,i){return new x("Line",[new s(t,e),new s(n,i)])},path:function(t){return new x("Path",t)},polygon:function(t){for(var e=[],n=0;n\n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n * @class\n * @param {string} status\n */\nfunction Intersection(status) {\n this.init(status);\n}\n\n\n/**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\nIntersection.prototype.init = function(status) {\n this.status = status;\n this.points = [];\n};\n\n\n/**\n * appendPoint\n *\n * @param {Point2D} point\n */\nIntersection.prototype.appendPoint = function(point) {\n this.points.push(point);\n};\n\n\n/**\n * appendPoints\n *\n * @param {Array} points\n */\nIntersection.prototype.appendPoints = function(points) {\n this.points = this.points.concat(points);\n};\n\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\nfunction IntersectionArgs(name, args) {\n this.init(name, args);\n}\n\n/**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\nIntersectionArgs.prototype.init = function(name, args) {\n this.name = name;\n this.args = args;\n};\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","IntersectionArgs","name","args","appendPoint","point","appendPoints","intersect","shape1","shape2","intersectPathShape","method","apply","path","shape","segment","inter","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index-umd.js b/dist/index-umd.js new file mode 100644 index 0000000..2b6e13c --- /dev/null +++ b/dist/index-umd.js @@ -0,0 +1,4115 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.KldIntersections = {})); +}(this, function (exports) { 'use strict'; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var Point2D_1 = createCommonjsModule(function (module) { + /** + * + * Point2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + * + */ + + /** + * Point2D + * + * @param {Number} x + * @param {Number} y + * @returns {Point2D} + */ + function Point2D(x, y) { + Object.defineProperties(this, { + "x": { + value: x !== undefined ? x : 0.0, + writable: false, + enumerable: true, + configurable: false + }, + "y": { + value: y !== undefined ? y : 0.0, + writable: false, + enumerable: true, + configurable: false + } + }); + } + /** + * clone + * + * @returns {Point2D} + */ + + + Point2D.prototype.clone = function () { + return new this.constructor(this.x, this.y); + }; + /** + * add + * + * @param {Point2D|Vector2D} that + * @returns {Point2D} + */ + + + Point2D.prototype.add = function (that) { + return new this.constructor(this.x + that.x, this.y + that.y); + }; + /** + * subtract + * + * @param { Vector2D | Point2D } that + * @returns {Point2D} + */ + + + Point2D.prototype.subtract = function (that) { + return new this.constructor(this.x - that.x, this.y - that.y); + }; + /** + * multiply + * + * @param {Number} scalar + * @returns {Point2D} + */ + + + Point2D.prototype.multiply = function (scalar) { + return new this.constructor(this.x * scalar, this.y * scalar); + }; + /** + * divide + * + * @param {Number} scalar + * @returns {Point2D} + */ + + + Point2D.prototype.divide = function (scalar) { + return new this.constructor(this.x / scalar, this.y / scalar); + }; + /** + * equals + * + * @param {Point2D} that + * @returns {Boolean} + */ + + + Point2D.prototype.equals = function (that) { + return this.x === that.x && this.y === that.y; + }; + /** + * precisionEquals + * + * @param {Point2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + + Point2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; + }; // utility methods + + /** + * lerp + * + * @param { Vector2D | Point2D } that + * @param {Number} t + @ @returns {Point2D} + */ + + + Point2D.prototype.lerp = function (that, t) { + var omt = 1.0 - t; + return new this.constructor(this.x * omt + that.x * t, this.y * omt + that.y * t); + }; + /** + * distanceFrom + * + * @param {Point2D} that + * @returns {Number} + */ + + + Point2D.prototype.distanceFrom = function (that) { + var dx = this.x - that.x; + var dy = this.y - that.y; + return Math.sqrt(dx * dx + dy * dy); + }; + /** + * min + * + * @param {Point2D} that + * @returns {Number} + */ + + + Point2D.prototype.min = function (that) { + return new this.constructor(Math.min(this.x, that.x), Math.min(this.y, that.y)); + }; + /** + * max + * + * @param {Point2D} that + * @returns {Number} + */ + + + Point2D.prototype.max = function (that) { + return new this.constructor(Math.max(this.x, that.x), Math.max(this.y, that.y)); + }; + /** + * transform + * + * @param {Matrix2D} + * @result {Point2D} + */ + + + Point2D.prototype.transform = function (matrix) { + return new this.constructor(matrix.a * this.x + matrix.c * this.y + matrix.e, matrix.b * this.x + matrix.d * this.y + matrix.f); + }; + /** + * toString + * + * @returns {String} + */ + + + Point2D.prototype.toString = function () { + return "point(" + this.x + "," + this.y + ")"; + }; + + { + module.exports = Point2D; + } + }); + + var Vector2D_1 = createCommonjsModule(function (module) { + /** + * + * Vector2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + * + */ + + /** + * Vector2D + * + * @param {Number} x + * @param {Number} y + * @returns {Vector2D} + */ + function Vector2D(x, y) { + Object.defineProperties(this, { + "x": { + value: x !== undefined ? x : 0.0, + writable: false, + enumerable: true, + configurable: false + }, + "y": { + value: y !== undefined ? y : 0.0, + writable: false, + enumerable: true, + configurable: false + } + }); + } + /** + * fromPoints + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @returns {Vector2D} + */ + + + Vector2D.fromPoints = function (p1, p2) { + return new Vector2D(p2.x - p1.x, p2.y - p1.y); + }; + /** + * length + * + * @returns {Number} + */ + + + Vector2D.prototype.length = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + /** + * magnitude + * + * @returns {Number} + */ + + + Vector2D.prototype.magnitude = function () { + return this.x * this.x + this.y * this.y; + }; + /** + * dot + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.dot = function (that) { + return this.x * that.x + this.y * that.y; + }; + /** + * cross + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.cross = function (that) { + return this.x * that.y - this.y * that.x; + }; + /** + * determinant + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.determinant = function (that) { + return this.x * that.y - this.y * that.x; + }; + /** + * unit + * + * @returns {Vector2D} + */ + + + Vector2D.prototype.unit = function () { + return this.divide(this.length()); + }; + /** + * add + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.add = function (that) { + return new this.constructor(this.x + that.x, this.y + that.y); + }; + /** + * subtract + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.subtract = function (that) { + return new this.constructor(this.x - that.x, this.y - that.y); + }; + /** + * multiply + * + * @param {Number} scalar + * @returns {Vector2D} + */ + + + Vector2D.prototype.multiply = function (scalar) { + return new this.constructor(this.x * scalar, this.y * scalar); + }; + /** + * divide + * + * @param {Number} scalar + * @returns {Vector2D} + */ + + + Vector2D.prototype.divide = function (scalar) { + return new this.constructor(this.x / scalar, this.y / scalar); + }; + /** + * angleBetween + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.angleBetween = function (that) { + var cos = this.dot(that) / (this.length() * that.length()); + cos = Math.max(-1, Math.min(cos, 1)); + var radians = Math.acos(cos); + return this.cross(that) < 0.0 ? -radians : radians; + }; + /** + * Find a vector is that is perpendicular to this vector + * + * @returns {Vector2D} + */ + + + Vector2D.prototype.perp = function () { + return new this.constructor(-this.y, this.x); + }; + /** + * Find the component of the specified vector that is perpendicular to + * this vector + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.perpendicular = function (that) { + return this.subtract(this.project(that)); + }; + /** + * project + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.project = function (that) { + var percent = this.dot(that) / that.dot(that); + return that.multiply(percent); + }; + /** + * transform + * + * @param {Matrix2D} + * @returns {Vector2D} + */ + + + Vector2D.prototype.transform = function (matrix) { + return new this.constructor(matrix.a * this.x + matrix.c * this.y, matrix.b * this.x + matrix.d * this.y); + }; + /** + * equals + * + * @param {Vector2D} that + * @returns {Boolean} + */ + + + Vector2D.prototype.equals = function (that) { + return this.x === that.x && this.y === that.y; + }; + /** + * precisionEquals + * + * @param {Vector2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + + Vector2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; + }; + /** + * toString + * + * @returns {String} + */ + + + Vector2D.prototype.toString = function () { + return "vector(" + this.x + "," + this.y + ")"; + }; + + { + module.exports = Vector2D; + } + }); + + var Matrix2D_1 = createCommonjsModule(function (module) { + /** + * Matrix2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + */ + function setReadonlyProperty(object, property, value) { + Object.defineProperty(object, property, { + value: value, + writable: false, + enumerable: true, + configurable: false + }); + } + /** + * Identity matrix + * + * @returns {Matrix2D} + */ + + + setReadonlyProperty(Matrix2D, "IDENTITY", new Matrix2D(1, 0, 0, 1, 0, 0)); + setReadonlyProperty(Matrix2D.IDENTITY, "isIdentity", function () { + return true; + }); + /** + * Matrix2D + * + * [a c e] + * [b d f] + * [0 0 1] + * + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + * @param {Number} e + * @param {Number} f + * @returns {Matrix2D} + */ + + function Matrix2D(a, b, c, d, e, f) { + setReadonlyProperty(this, "a", a !== undefined ? a : 1); + setReadonlyProperty(this, "b", b !== undefined ? b : 0); + setReadonlyProperty(this, "c", c !== undefined ? c : 0); + setReadonlyProperty(this, "d", d !== undefined ? d : 1); + setReadonlyProperty(this, "e", e !== undefined ? e : 0); + setReadonlyProperty(this, "f", f !== undefined ? f : 0); + } // *** STATIC METHODS + + /** + * translation + * + * @param {Number} tx + * @param {Number} ty + * @returns {Matrix2D} + */ + + + Matrix2D.translation = function (tx, ty) { + return new Matrix2D(1, 0, 0, 1, tx, ty); + }; + /** + * scaling + * + * @param {Number} scale + * @returns {Matrix2D} + */ + + + Matrix2D.scaling = function (scale) { + return new Matrix2D(scale, 0, 0, scale, 0, 0); + }; + /** + * scalingAt + * + * @param {Number} scale + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.scalingAt = function (scale, center) { + return new Matrix2D(scale, 0, 0, scale, center.x - center.x * scale, center.y - center.y * scale); + }; + /** + * nonUniformScaling + * + * @param {Number} scaleX + * @param {Number} scaleY + * @returns {Matrix2D} + */ + + + Matrix2D.nonUniformScaling = function (scaleX, scaleY) { + return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0); + }; + /** + * nonUniformScalingAt + * + * @param {Number} scaleX + * @param {Number} scaleY + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.nonUniformScalingAt = function (scaleX, scaleY, center) { + return new Matrix2D(scaleX, 0, 0, scaleY, center.x - center.x * scaleX, center.y - center.y * scaleY); + }; + /** + * rotation + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.rotation = function (radians) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new Matrix2D(c, s, -s, c, 0, 0); + }; + /** + * rotationAt + * + * @param {Number} radians + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.rotationAt = function (radians, center) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new Matrix2D(c, s, -s, c, center.x - center.x * c + center.y * s, center.y - center.y * c - center.x * s); + }; + /** + * rotationFromVector + * + * @param {Vector2D} + * @returns {Matrix2D} + */ + + + Matrix2D.rotationFromVector = function (vector) { + var unit = vector.unit(); + var c = unit.x; // cos + + var s = unit.y; // sin + + return new Matrix2D(c, s, -s, c, 0, 0); + }; + /** + * xFlip + * + * @returns {Matrix2D} + */ + + + Matrix2D.xFlip = function () { + return new Matrix2D(-1, 0, 0, 1, 0, 0); + }; + /** + * yFlip + * + * @returns {Matrix2D} + */ + + + Matrix2D.yFlip = function () { + return new Matrix2D(1, 0, 0, -1, 0, 0); + }; + /** + * xSkew + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.xSkew = function (radians) { + var t = Math.tan(radians); + return new Matrix2D(1, 0, t, 1, 0, 0); + }; + /** + * ySkew + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.ySkew = function (radians) { + var t = Math.tan(radians); + return new Matrix2D(1, t, 0, 1, 0, 0); + }; // *** METHODS + + /** + * multiply + * + * @pararm {Matrix2D} that + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.multiply = function (that) { + if (this.isIdentity()) { + return that; + } + + if (that.isIdentity()) { + return this; + } + + return new this.constructor(this.a * that.a + this.c * that.b, this.b * that.a + this.d * that.b, this.a * that.c + this.c * that.d, this.b * that.c + this.d * that.d, this.a * that.e + this.c * that.f + this.e, this.b * that.e + this.d * that.f + this.f); + }; + /** + * inverse + * + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.inverse = function () { + if (this.isIdentity()) { + return this; + } + + var det1 = this.a * this.d - this.b * this.c; + + if (det1 === 0.0) { + throw "Matrix is not invertible"; + } + + var idet = 1.0 / det1; + var det2 = this.f * this.c - this.e * this.d; + var det3 = this.e * this.b - this.f * this.a; + return new this.constructor(this.d * idet, -this.b * idet, -this.c * idet, this.a * idet, det2 * idet, det3 * idet); + }; + /** + * translate + * + * @param {Number} tx + * @param {Number} ty + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.translate = function (tx, ty) { + return new this.constructor(this.a, this.b, this.c, this.d, this.a * tx + this.c * ty + this.e, this.b * tx + this.d * ty + this.f); + }; + /** + * scale + * + * @param {Number} scale + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scale = function (scale) { + return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.e, this.f); + }; + /** + * scaleAt + * + * @param {Number} scale + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scaleAt = function (scale, center) { + var dx = center.x - scale * center.x; + var dy = center.y - scale * center.y; + return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); + }; + /** + * scaleNonUniform + * + * @param {Number} scaleX + * @param {Number} scaleY + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scaleNonUniform = function (scaleX, scaleY) { + return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.e, this.f); + }; + /** + * scaleNonUniformAt + * + * @param {Number} scaleX + * @param {Number} scaleY + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scaleNonUniformAt = function (scaleX, scaleY, center) { + var dx = center.x - scaleX * center.x; + var dy = center.y - scaleY * center.y; + return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); + }; + /** + * rotate + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.rotate = function (radians) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); + }; + /** + * rotateAt + * + * @param {Number} radians + * @param {Point2D} center + * @result {Matrix2D} + */ + + + Matrix2D.prototype.rotateAt = function (radians, center) { + var cos = Math.cos(radians); + var sin = Math.sin(radians); + var cx = center.x; + var cy = center.y; + var a = this.a * cos + this.c * sin; + var b = this.b * cos + this.d * sin; + var c = this.c * cos - this.a * sin; + var d = this.d * cos - this.b * sin; + return new this.constructor(a, b, c, d, (this.a - a) * cx + (this.c - c) * cy + this.e, (this.b - b) * cx + (this.d - d) * cy + this.f); + }; + /** + * rotateFromVector + * + * @param {Vector2D} + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.rotateFromVector = function (vector) { + var unit = vector.unit(); + var c = unit.x; // cos + + var s = unit.y; // sin + + return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); + }; + /** + * flipX + * + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.flipX = function () { + return new this.constructor(-this.a, -this.b, this.c, this.d, this.e, this.f); + }; + /** + * flipY + * + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.flipY = function () { + return new this.constructor(this.a, this.b, -this.c, -this.d, this.e, this.f); + }; + /** + * skewX + * + * @pararm {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.skewX = function (radians) { + var t = Math.tan(radians); + return new this.constructor(this.a, this.b, this.c + this.a * t, this.d + this.b * t, this.e, this.f); + }; // TODO: skewXAt + + /** + * skewY + * + * @pararm {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.skewY = function (radians) { + var t = Math.tan(radians); + return new this.constructor(this.a + this.c * t, this.b + this.d * t, this.c, this.d, this.e, this.f); + }; // TODO: skewYAt + + /** + * isIdentity + * + * @returns {Boolean} + */ + + + Matrix2D.prototype.isIdentity = function () { + return this.a === 1.0 && this.b === 0.0 && this.c === 0.0 && this.d === 1.0 && this.e === 0.0 && this.f === 0.0; + }; + /** + * isInvertible + * + * @returns {Boolean} + */ + + + Matrix2D.prototype.isInvertible = function () { + return this.a * this.d - this.b * this.c !== 0.0; + }; + /** + * getScale + * + * @returns {{ scaleX: Number, scaleY: Number }} + */ + + + Matrix2D.prototype.getScale = function () { + return { + scaleX: Math.sqrt(this.a * this.a + this.c * this.c), + scaleY: Math.sqrt(this.b * this.b + this.d * this.d) + }; + }; + /** + * getDecomposition + * + * Calculates matrix Singular Value Decomposition + * + * The resulting matrices, translation, rotation, scale, and rotation0, return + * this matrix when they are muliplied together in the listed order + * + * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688} + * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation} + * + * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }} + */ + + + Matrix2D.prototype.getDecomposition = function () { + var E = (this.a + this.d) * 0.5; + var F = (this.a - this.d) * 0.5; + var G = (this.b + this.c) * 0.5; + var H = (this.b - this.c) * 0.5; + var Q = Math.sqrt(E * E + H * H); + var R = Math.sqrt(F * F + G * G); + var scaleX = Q + R; + var scaleY = Q - R; + var a1 = Math.atan2(G, F); + var a2 = Math.atan2(H, E); + var theta = (a2 - a1) * 0.5; + var phi = (a2 + a1) * 0.5; // TODO: Add static methods to generate translation, rotation, etc. + // matrices directly + + return { + translation: new this.constructor(1, 0, 0, 1, this.e, this.f), + rotation: this.constructor.IDENTITY.rotate(phi), + scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0), + rotation0: this.constructor.IDENTITY.rotate(theta) + }; + }; + /** + * equals + * + * @param {Matrix2D} that + * @returns {Boolean} + */ + + + Matrix2D.prototype.equals = function (that) { + return this.a === that.a && this.b === that.b && this.c === that.c && this.d === that.d && this.e === that.e && this.f === that.f; + }; + /** + * precisionEquals + * + * @param {Matrix2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + + Matrix2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.a - that.a) < precision && Math.abs(this.b - that.b) < precision && Math.abs(this.c - that.c) < precision && Math.abs(this.d - that.d) < precision && Math.abs(this.e - that.e) < precision && Math.abs(this.f - that.f) < precision; + }; + /** + * toString + * + * @returns {String} + */ + + + Matrix2D.prototype.toString = function () { + return "matrix(" + [this.a, this.b, this.c, this.d, this.e, this.f].join(",") + ")"; + }; + + { + module.exports = Matrix2D; + } + }); + + // expose classes + var Point2D = Point2D_1; + var Vector2D = Vector2D_1; + var Matrix2D = Matrix2D_1; + + var Polynomial_1 = createCommonjsModule(function (module) { + /** + * + * Polynomial.js + * + * copyright 2002, 2013 Kevin Lindsey + * + * contribution {@link http://github.com/Quazistax/kld-polynomial} + * @copyright 2015 Robert Benko (Quazistax) + * @license MIT + */ + Polynomial.TOLERANCE = 1e-6; + Polynomial.ACCURACY = 15; + /** + * interpolate + * + * Based on poloint in "Numerical Recipes in C, 2nd Edition", pages 109-110 + * + * @param {Array} xs + * @param {Array} ys + * @param {Number} n + * @param {Number} offset + * @param {Number} x + * + * @returns {{y: Number, dy: Number}} + */ + + Polynomial.interpolate = function (xs, ys, n, offset, x) { + if (xs.constructor !== Array || ys.constructor !== Array) { + throw new Error("Polynomial.interpolate: xs and ys must be arrays"); + } + + if (isNaN(n) || isNaN(offset) || isNaN(x)) { + throw new Error("Polynomial.interpolate: n, offset, and x must be numbers"); + } + + var y = 0; + var dy = 0; + var c = new Array(n); + var d = new Array(n); + var ns = 0; + var diff = Math.abs(x - xs[offset]); + + for (var i = 0; i < n; i++) { + var dift = Math.abs(x - xs[offset + i]); + + if (dift < diff) { + ns = i; + diff = dift; + } + + c[i] = d[i] = ys[offset + i]; + } + + y = ys[offset + ns]; + ns--; + + for (var m = 1; m < n; m++) { + for (var i = 0; i < n - m; i++) { + var ho = xs[offset + i] - x; + var hp = xs[offset + i + m] - x; + var w = c[i + 1] - d[i]; + var den = ho - hp; + + if (den == 0.0) { + throw new Error("Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)"); + } + + den = w / den; + d[i] = hp * den; + c[i] = ho * den; + } + + dy = 2 * (ns + 1) < n - m ? c[ns + 1] : d[ns--]; + y += dy; + } + + return { + y: y, + dy: dy + }; + }; + /** + * Polynomial + * + * @returns {Polynomial} + */ + + + function Polynomial() { + this.init(arguments); + } + /** + * init + */ + + + Polynomial.prototype.init = function (coefs) { + this.coefs = new Array(); + + for (var i = coefs.length - 1; i >= 0; i--) { + this.coefs.push(coefs[i]); + } + + this._variable = "t"; + this._s = 0; + }; + /** + * eval + */ + + + Polynomial.prototype.eval = function (x) { + if (isNaN(x)) { + throw new Error("Polynomial.eval: parameter must be a number"); + } + + var result = 0; + + for (var i = this.coefs.length - 1; i >= 0; i--) { + result = result * x + this.coefs[i]; + } + + return result; + }; + /** + * add + */ + + + Polynomial.prototype.add = function (that) { + var result = new Polynomial(); + var d1 = this.getDegree(); + var d2 = that.getDegree(); + var dmax = Math.max(d1, d2); + + for (var i = 0; i <= dmax; i++) { + var v1 = i <= d1 ? this.coefs[i] : 0; + var v2 = i <= d2 ? that.coefs[i] : 0; + result.coefs[i] = v1 + v2; + } + + return result; + }; + /** + * multiply + */ + + + Polynomial.prototype.multiply = function (that) { + var result = new Polynomial(); + + for (var i = 0; i <= this.getDegree() + that.getDegree(); i++) { + result.coefs.push(0); + } + + for (var i = 0; i <= this.getDegree(); i++) { + for (var j = 0; j <= that.getDegree(); j++) { + result.coefs[i + j] += this.coefs[i] * that.coefs[j]; + } + } + + return result; + }; + /** + * divide_scalar + */ + + + Polynomial.prototype.divide_scalar = function (scalar) { + for (var i = 0; i < this.coefs.length; i++) { + this.coefs[i] /= scalar; + } + }; + /** + * simplify + */ + + + Polynomial.prototype.simplify = function (TOLERANCE) { + if (TOLERANCE === undefined) TOLERANCE = 1e-12; + + for (var i = this.getDegree(); i >= 0; i--) { + if (Math.abs(this.coefs[i]) <= TOLERANCE) { + this.coefs.pop(); + } else { + break; + } + } + }; + /** + * bisection + */ + + + Polynomial.prototype.bisection = function (min, max) { + var minValue = this.eval(min); + var maxValue = this.eval(max); + var result; + + if (Math.abs(minValue) <= Polynomial.TOLERANCE) { + result = min; + } else if (Math.abs(maxValue) <= Polynomial.TOLERANCE) { + result = max; + } else if (minValue * maxValue <= 0) { + var tmp1 = Math.log(max - min); + var tmp2 = Math.LN10 * Polynomial.ACCURACY; + var iters = Math.ceil((tmp1 + tmp2) / Math.LN2); + + for (var i = 0; i < iters; i++) { + result = 0.5 * (min + max); + var value = this.eval(result); + + if (Math.abs(value) <= Polynomial.TOLERANCE) { + break; + } + + if (value * minValue < 0) { + max = result; + maxValue = value; + } else { + min = result; + minValue = value; + } + } + } + + return result; + }; + /** + * toString + */ + + + Polynomial.prototype.toString = function () { + var coefs = new Array(); + var signs = new Array(); + + for (var i = this.coefs.length - 1; i >= 0; i--) { + var value = Math.round(this.coefs[i] * 1000) / 1000; //var value = this.coefs[i]; + + if (value != 0) { + var sign = value < 0 ? " - " : " + "; + value = Math.abs(value); + + if (i > 0) { + if (value == 1) { + value = this._variable; + } else { + value += this._variable; + } + } + + if (i > 1) { + value += "^" + i; + } + + signs.push(sign); + coefs.push(value); + } + } + + signs[0] = signs[0] == " + " ? "" : "-"; + var result = ""; + + for (var i = 0; i < coefs.length; i++) { + result += signs[i] + coefs[i]; + } + + return result; + }; + /** + * trapezoid + * + * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 137 + */ + + + Polynomial.prototype.trapezoid = function (min, max, n) { + if (isNaN(min) || isNaN(max) || isNaN(n)) { + throw new Error("Polynomial.trapezoid: parameters must be numbers"); + } + + var range = max - min; + + if (n == 1) { + var minValue = this.eval(min); + var maxValue = this.eval(max); + this._s = 0.5 * range * (minValue + maxValue); + } else { + var it = 1 << n - 2; + var delta = range / it; + var x = min + 0.5 * delta; + var sum = 0; + + for (var i = 0; i < it; i++) { + sum += this.eval(x); + x += delta; + } + + this._s = 0.5 * (this._s + range * sum / it); + } + + if (isNaN(this._s)) { + throw new Error("Polynomial.trapezoid: this._s is NaN"); + } + + return this._s; + }; + /** + * simpson + * + * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 139 + */ + + + Polynomial.prototype.simpson = function (min, max) { + if (isNaN(min) || isNaN(max)) { + throw new Error("Polynomial.simpson: parameters must be numbers"); + } + + var range = max - min; + var st = 0.5 * range * (this.eval(min) + this.eval(max)); + var t = st; + var s = 4.0 * st / 3.0; + var os = s; + var ost = st; + var TOLERANCE = 1e-7; + var it = 1; + + for (var n = 2; n <= 20; n++) { + var delta = range / it; + var x = min + 0.5 * delta; + var sum = 0; + + for (var i = 1; i <= it; i++) { + sum += this.eval(x); + x += delta; + } + + t = 0.5 * (t + range * sum / it); + st = t; + s = (4.0 * st - ost) / 3.0; + + if (Math.abs(s - os) < TOLERANCE * Math.abs(os)) { + break; + } + + os = s; + ost = st; + it <<= 1; + } + + return s; + }; + /** + * romberg + */ + + + Polynomial.prototype.romberg = function (min, max) { + if (isNaN(min) || isNaN(max)) { + throw new Error("Polynomial.romberg: parameters must be numbers"); + } + + var MAX = 20; + var K = 3; + var TOLERANCE = 1e-6; + var s = new Array(MAX + 1); + var h = new Array(MAX + 1); + var result = { + y: 0, + dy: 0 + }; + h[0] = 1.0; + + for (var j = 1; j <= MAX; j++) { + s[j - 1] = this.trapezoid(min, max, j); + + if (j >= K) { + result = Polynomial.interpolate(h, s, K, j - K, 0.0); + if (Math.abs(result.dy) <= TOLERANCE * result.y) break; + } + + s[j] = s[j - 1]; + h[j] = 0.25 * h[j - 1]; + } + + return result.y; + }; // getters and setters + + /** + * get degree + */ + + + Polynomial.prototype.getDegree = function () { + return this.coefs.length - 1; + }; + /** + * getDerivative + */ + + + Polynomial.prototype.getDerivative = function () { + var derivative = new Polynomial(); + + for (var i = 1; i < this.coefs.length; i++) { + derivative.coefs.push(i * this.coefs[i]); + } + + return derivative; + }; + /** + * getRoots + */ + + + Polynomial.prototype.getRoots = function () { + var result; + this.simplify(); + + switch (this.getDegree()) { + case 0: + result = []; + break; + + case 1: + result = this.getLinearRoot(); + break; + + case 2: + result = this.getQuadraticRoots(); + break; + + case 3: + result = this.getCubicRoots(); + break; + + case 4: + result = this.getQuarticRoots(); + break; + + default: + result = []; + } + + return result; + }; + /** + * getRootsInInterval + */ + + + Polynomial.prototype.getRootsInInterval = function (min, max) { + var roots = new Array(); + var root; + + if (this.getDegree() == 1) { + root = this.bisection(min, max); + + if (root != null) { + roots.push(root); + } + } else { + // get roots of derivative + var deriv = this.getDerivative(); + var droots = deriv.getRootsInInterval(min, max); + + if (droots.length > 0) { + // find root on [min, droots[0]] + root = this.bisection(min, droots[0]); + + if (root != null) { + roots.push(root); + } // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2 + + + for (i = 0; i <= droots.length - 2; i++) { + root = this.bisection(droots[i], droots[i + 1]); + + if (root != null) { + roots.push(root); + } + } // find root on [droots[count-1],xmax] + + + root = this.bisection(droots[droots.length - 1], max); + + if (root != null) { + roots.push(root); + } + } else { + // polynomial is monotone on [min,max], has at most one root + root = this.bisection(min, max); + + if (root != null) { + roots.push(root); + } + } + } + + return roots; + }; + /** + * getLinearRoot + */ + + + Polynomial.prototype.getLinearRoot = function () { + var result = []; + var a = this.coefs[1]; + + if (a != 0) { + result.push(-this.coefs[0] / a); + } + + return result; + }; + /** + * getQuadraticRoots + */ + + + Polynomial.prototype.getQuadraticRoots = function () { + var results = []; + + if (this.getDegree() == 2) { + var a = this.coefs[2]; + var b = this.coefs[1] / a; + var c = this.coefs[0] / a; + var d = b * b - 4 * c; + + if (d > 0) { + var e = Math.sqrt(d); + results.push(0.5 * (-b + e)); + results.push(0.5 * (-b - e)); + } else if (d == 0) { + // really two roots with same value, but we only return one + results.push(0.5 * -b); + } + } + + return results; + }; + /** + * getCubicRoots + * + * This code is based on MgcPolynomial.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.geometrictools.com + */ + + + Polynomial.prototype.getCubicRoots = function () { + var results = []; + + if (this.getDegree() == 3) { + var c3 = this.coefs[3]; + var c2 = this.coefs[2] / c3; + var c1 = this.coefs[1] / c3; + var c0 = this.coefs[0] / c3; + var a = (3 * c1 - c2 * c2) / 3; + var b = (2 * c2 * c2 * c2 - 9 * c1 * c2 + 27 * c0) / 27; + var offset = c2 / 3; + var discrim = b * b / 4 + a * a * a / 27; + var halfB = b / 2; + var ZEROepsilon = this.zeroErrorEstimate(); + + if (Math.abs(discrim) <= ZEROepsilon) { + discrim = 0; + } + + if (discrim > 0) { + var e = Math.sqrt(discrim); + var tmp; + var root; + tmp = -halfB + e; + + if (tmp >= 0) { + root = Math.pow(tmp, 1 / 3); + } else { + root = -Math.pow(-tmp, 1 / 3); + } + + tmp = -halfB - e; + + if (tmp >= 0) { + root += Math.pow(tmp, 1 / 3); + } else { + root -= Math.pow(-tmp, 1 / 3); + } + + results.push(root - offset); + } else if (discrim < 0) { + var distance = Math.sqrt(-a / 3); + var angle = Math.atan2(Math.sqrt(-discrim), -halfB) / 3; + var cos = Math.cos(angle); + var sin = Math.sin(angle); + var sqrt3 = Math.sqrt(3); + results.push(2 * distance * cos - offset); + results.push(-distance * (cos + sqrt3 * sin) - offset); + results.push(-distance * (cos - sqrt3 * sin) - offset); + } else { + var tmp; + + if (halfB >= 0) { + tmp = -Math.pow(halfB, 1 / 3); + } else { + tmp = Math.pow(-halfB, 1 / 3); + } + + results.push(2 * tmp - offset); // really should return next root twice, but we return only one + + results.push(-tmp - offset); + } + } + + return results; + }; + /** + * Sign of a number (+1, -1, +0, -0). + */ + + + var sign = function sign(x) { + return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN; + }; + /** + * Calculates roots of quartic polynomial.
+ * First, derivative roots are found, then used to split quartic polynomial + * into segments, each containing one root of quartic polynomial. + * Segments are then passed to newton's method to find roots. + * + * @returns {Array} roots + */ + + + Polynomial.prototype.getQuarticRoots = function () { + var results = []; + var n = this.getDegree(); + + if (n == 4) { + var poly = new Polynomial(); + poly.coefs = this.coefs.slice(); + poly.divide_scalar(poly.coefs[n]); + var ERRF = 1e-15; + + if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) { + poly.coefs[0] = 0; + } + + var poly_d = poly.getDerivative(); + var derrt = poly_d.getRoots().sort(function (a, b) { + return a - b; + }); + var dery = []; + var nr = derrt.length - 1; + var i; + var rb = this.bounds(); + maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); + var ZEROepsilon = this.zeroErrorEstimate(maxabsX); + + for (i = 0; i <= nr; i++) { + dery.push(poly.eval(derrt[i])); + } + + for (i = 0; i <= nr; i++) { + if (Math.abs(dery[i]) < ZEROepsilon) { + dery[i] = 0; + } + } + + i = 0; + var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF); + var guesses = []; + var minmax = []; + + if (nr > -1) { + if (dery[0] != 0) { + if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) { + guesses.push(derrt[0] - dx); + minmax.push([rb.minX, derrt[0]]); + } + } else { + results.push(derrt[0], derrt[0]); + i++; + } + + for (; i < nr; i++) { + if (dery[i + 1] == 0) { + results.push(derrt[i + 1], derrt[i + 1]); + i++; + } else if (sign(dery[i]) != sign(dery[i + 1])) { + guesses.push((derrt[i] + derrt[i + 1]) / 2); + minmax.push([derrt[i], derrt[i + 1]]); + } + } + + if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) { + guesses.push(derrt[nr] + dx); + minmax.push([derrt[nr], rb.maxX]); + } + } + + var f = function f(x) { + return poly.eval(x); + }; + + var df = function df(x) { + return poly_d.eval(x); + }; + + if (guesses.length > 0) { + for (i = 0; i < guesses.length; i++) { + guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]); + } + } + + results = results.concat(guesses); + } + + return results; + }; + /** + * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0. + * + * @returns {Number} + */ + + + Polynomial.prototype.zeroErrorEstimate = function (maxabsX) { + var poly = this; + var ERRF = 1e-15; + + if (typeof maxabsX === 'undefined') { + var rb = poly.bounds(); + maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); + } + + if (maxabsX < 0.001) { + return 2 * Math.abs(poly.eval(ERRF)); + } + + var n = poly.coefs.length - 1; + var an = poly.coefs[n]; + return 10 * ERRF * poly.coefs.reduce(function (m, v, i) { + var nm = v / an * Math.pow(maxabsX, i); + return nm > m ? nm : m; + }, 0); + }; + /** + * Calculates upper Real roots bounds.
+ * Real roots are in interval [negX, posX]. Determined by Fujiwara method. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ negX: Number, posX: Number }} + */ + + + Polynomial.prototype.bounds_UpperReal_Fujiwara = function () { + var a = this.coefs; + var n = a.length - 1; + var an = a[n]; + + if (an != 1) { + a = this.coefs.map(function (v) { + return v / an; + }); + } + + var b = a.map(function (v, i) { + return i < n ? Math.pow(Math.abs(i == 0 ? v / 2 : v), 1 / (n - i)) : v; + }); + var coefSelectionFunc; + + var find2Max = function find2Max(acc, bi, i) { + if (coefSelectionFunc(i)) { + if (acc.max < bi) { + acc.nearmax = acc.max; + acc.max = bi; + } else if (acc.nearmax < bi) { + acc.nearmax = bi; + } + } + + return acc; + }; + + coefSelectionFunc = function coefSelectionFunc(i) { + return i < n && a[i] < 0; + }; + + var max_nearmax_pos = b.reduce(find2Max, { + max: 0, + nearmax: 0 + }); + + coefSelectionFunc = function coefSelectionFunc(i) { + return i < n && (n % 2 == i % 2 ? a[i] < 0 : a[i] > 0); + }; + + var max_nearmax_neg = b.reduce(find2Max, { + max: 0, + nearmax: 0 + }); + return { + negX: -2 * max_nearmax_neg.max, + posX: 2 * max_nearmax_pos.max + }; + }; + /** + * Calculates lower Real roots bounds.
+ * There are no Real roots in interval . Determined by Fujiwara method. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ negX: Number, posX: Number }} + */ + + + Polynomial.prototype.bounds_LowerReal_Fujiwara = function () { + var poly = new Polynomial(); + poly.coefs = this.coefs.slice().reverse(); + var res = poly.bounds_UpperReal_Fujiwara(); + res.negX = 1 / res.negX; + res.posX = 1 / res.posX; + return res; + }; + /** + * Calculates left and right Real roots bounds.
+ * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ minX: Number, maxX: Number }} + */ + + + Polynomial.prototype.bounds = function () { + var urb = this.bounds_UpperReal_Fujiwara(); + var rb = { + minX: urb.negX, + maxX: urb.posX + }; + + if (urb.negX === 0 && urb.posX === 0) { + return rb; + } + + if (urb.negX === 0) { + rb.minX = this.bounds_LowerReal_Fujiwara().posX; + } else if (urb.posX === 0) { + rb.maxX = this.bounds_LowerReal_Fujiwara().negX; + } + + if (rb.minX > rb.maxX) { + //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?'); + rb.minX = rb.maxX = 0; + } + + return rb; // TODO: if sure that there are no complex roots + // (maybe by using Sturm's theorem) use: + // return this.bounds_Real_Laguerre(); + }; + /** + * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
+ * When using bounds, algorithm falls back to secant if newton goes out of range. + * Bisection is fallback for secant when determined secant is not efficient enough. + * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method} + * @see {@link http://en.wikipedia.org/wiki/Secant_method} + * @see {@link http://en.wikipedia.org/wiki/Bisection_method} + * + * @param {Number} x0 - Inital root guess + * @param {function(x)} f - Function which root we are trying to find + * @param {function(x)} df - Derivative of function f + * @param {Number} max_iterations - Maximum number of algorithm iterations + * @param {Number} [min_x] - Left bound value + * @param {Number} [max_x] - Right bound value + * @returns {Number} - root + */ + + + Polynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) { + var x, + prev_dfx = 0, + dfx, + prev_x_ef_correction = 0, + x_correction, + x_new; + var y_atmin, y_atmax; + x = x0; + var ACCURACY = 14; + var min_correction_factor = Math.pow(10, -ACCURACY); + var isBounded = typeof min === 'number' && typeof max === 'number'; + + if (isBounded) { + if (min > max) { + throw new Error("newton root finding: min must be greater than max"); + } + + y_atmin = f(min); + y_atmax = f(max); + + if (sign(y_atmin) == sign(y_atmax)) { + throw new Error("newton root finding: y values of bounds must be of opposite sign"); + } + } + + var isEnoughCorrection = function isEnoughCorrection() { + // stop if correction is too small or if correction is in simple loop + return Math.abs(x_correction) <= min_correction_factor * Math.abs(x) || prev_x_ef_correction == x - x_correction - x; + }; + + var i; + + for (i = 0; i < max_iterations; i++) { + dfx = df(x); + + if (dfx == 0) { + if (prev_dfx == 0) { + // error + throw new Error("newton root finding: df(x) is zero"); + } else { + // use previous derivation value + dfx = prev_dfx; + } // or move x a little? + //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15); + + } + + prev_dfx = dfx; + y = f(x); + x_correction = y / dfx; + x_new = x - x_correction; + + if (isEnoughCorrection()) { + break; + } + + if (isBounded) { + if (sign(y) == sign(y_atmax)) { + max = x; + y_atmax = y; + } else if (sign(y) == sign(y_atmin)) { + min = x; + y_atmin = y; + } else { + x = x_new; + break; + } + + if (x_new < min || x_new > max) { + if (sign(y_atmin) == sign(y_atmax)) { + break; + } + + var RATIO_LIMIT = 50; + var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5) + + var dy = y_atmax - y_atmin; + var dx = max - min; + + if (dy == 0) { + x_correction = x - (min + dx * 0.5); + } else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) { + x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET))); + } else { + x_correction = x - (min - y_atmin / dy * dx); + } + + x_new = x - x_correction; + + if (isEnoughCorrection()) { + break; + } + } + } + + prev_x_ef_correction = x - x_new; + x = x_new; + } + + return x; + }; + + { + module.exports = Polynomial; + } + }); + + var SqrtPolynomial_1 = createCommonjsModule(function (module) { + /** + * + * SqrtPolynomial.js + * + * copyright 2003, 2013 Kevin Lindsey + * + */ + { + var Polynomial = Polynomial_1; + } + /** + * class variables + */ + + + SqrtPolynomial.VERSION = 1.0; // setup inheritance + + SqrtPolynomial.prototype = new Polynomial(); + SqrtPolynomial.prototype.constructor = SqrtPolynomial; + SqrtPolynomial.superclass = Polynomial.prototype; + /** + * SqrtPolynomial + */ + + function SqrtPolynomial() { + this.init(arguments); + } + /** + * eval + * + * @param {Number} x + * @returns {Number} + */ + + + SqrtPolynomial.prototype.eval = function (x) { + var TOLERANCE = 1e-7; + var result = SqrtPolynomial.superclass.eval.call(this, x); // NOTE: May need to change the following. I added these to capture + // some really small negative values that were being generated by one + // of my Bezier arcLength functions + + if (Math.abs(result) < TOLERANCE) result = 0; + if (result < 0) throw new Error("SqrtPolynomial.eval: cannot take square root of negative number"); + return Math.sqrt(result); + }; + + SqrtPolynomial.prototype.toString = function () { + var result = SqrtPolynomial.superclass.toString.call(this); + return "sqrt(" + result + ")"; + }; + + { + module.exports = SqrtPolynomial; + } + }); + + // expose classes + var Polynomial = Polynomial_1; + + /* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */ + /** + * + * @param {*} o + * @returns {boolean} + */ + + function isNullish(o) { + return o === null || o === undefined; + } + /** + * closePolygon + * + * @param {Array} points + * @returns {Array} + */ + + + function closePolygon(points) { + var copy = points.slice(); + copy.push(points[0]); + return copy; + } + /** + * Intersection + * @class + * @param {string} status + */ + + + function Intersection(status) { + this.init(status); + } + /** + * init + * + * @param {string} status + * @returns {Intersection} + */ + + + Intersection.prototype.init = function (status) { + this.status = status; + this.points = []; + }; + /** + * appendPoint + * + * @param {Point2D} point + */ + + + Intersection.prototype.appendPoint = function (point) { + this.points.push(point); + }; + /** + * appendPoints + * + * @param {Array} points + */ + + + Intersection.prototype.appendPoints = function (points) { + this.points = this.points.concat(points); + }; // static methods + + /** + * intersect + * + * @param {IntersectionArgs} shape1 + * @param {IntersectionArgs} shape2 + * @returns {Intersection} + */ + + + Intersection.intersect = function (shape1, shape2) { + var result; + + if (!isNullish(shape1) && !isNullish(shape2)) { + if (shape1.name === "Path") { + result = Intersection.intersectPathShape(shape1, shape2); + } else if (shape2.name === "Path") { + result = Intersection.intersectPathShape(shape2, shape1); + } else { + var method; + var args; + + if (shape1.name < shape2.name) { + method = "intersect" + shape1.name + shape2.name; + args = shape1.args.concat(shape2.args); + } else { + method = "intersect" + shape2.name + shape1.name; + args = shape2.args.concat(shape1.args); + } + + if (!(method in Intersection)) { + throw new Error("Intersection not available: " + method); + } + + result = Intersection[method].apply(null, args); + } + } else { + result = new Intersection("No Intersection"); + } + + return result; + }; + /** + * intersectPathShape + * + * @param {IntersectionArgs} path + * @param {IntersectionArgs} shape + * @returns {Intersection} + */ + + + Intersection.intersectPathShape = function (path, shape) { + var result = new Intersection("No Intersection"); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = path.args[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var segment = _step.value; + var inter = Intersection.intersect(segment, shape); + result.appendPoints(inter.points); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Bezier2 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Bezier2 = function (a1, a2, a3, b1, b2, b3) { + var a, b; + var result = new Intersection("No Intersection"); + a = a2.multiply(-2); + var c12 = a1.add(a.add(a3)); + a = a1.multiply(-2); + b = a2.multiply(2); + var c11 = a.add(b); + var c10 = new Point2D(a1.x, a1.y); + a = b2.multiply(-2); + var c22 = b1.add(a.add(b3)); + a = b1.multiply(-2); + b = b2.multiply(2); + var c21 = a.add(b); + var c20 = new Point2D(b1.x, b1.y); // bezout + + a = c12.x * c11.y - c11.x * c12.y; + b = c22.x * c11.y - c11.x * c22.y; + var c = c21.x * c11.y - c11.x * c21.y; + var d = c11.x * (c10.y - c20.y) + c11.y * (-c10.x + c20.x); + var e = c22.x * c12.y - c12.x * c22.y; + var f = c21.x * c12.y - c12.x * c21.y; + var g = c12.x * (c10.y - c20.y) + c12.y * (-c10.x + c20.x); // determinant + + var poly = new Polynomial(-e * e, -2 * e * f, a * b - f * f - 2 * e * g, a * c - 2 * f * g, a * d - g * g); + var roots = poly.getRoots(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = roots[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var s = _step2.value; + + if (0 <= s && s <= 1) { + var xp = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x); + xp.simplify(); + var xRoots = xp.getRoots(); + var yp = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y); + yp.simplify(); + var yRoots = yp.getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + checkRoots: for (var _iterator3 = xRoots[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var xRoot = _step3.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c22.multiply(s * s).add(c21.multiply(s).add(c20))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Bezier3 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @param {Point2D} b4 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Bezier3 = function (a1, a2, a3, b1, b2, b3, b4) { + var a, b, c, d; + var result = new Intersection("No Intersection"); + a = a2.multiply(-2); + var c12 = a1.add(a.add(a3)); + a = a1.multiply(-2); + b = a2.multiply(2); + var c11 = a.add(b); + var c10 = new Point2D(a1.x, a1.y); + a = b1.multiply(-1); + b = b2.multiply(3); + c = b3.multiply(-3); + d = a.add(b.add(c.add(b4))); + var c23 = new Vector2D(d.x, d.y); + a = b1.multiply(3); + b = b2.multiply(-6); + c = b3.multiply(3); + d = a.add(b.add(c)); + var c22 = new Vector2D(d.x, d.y); + a = b1.multiply(-3); + b = b2.multiply(3); + c = a.add(b); + var c21 = new Vector2D(c.x, c.y); + var c20 = new Vector2D(b1.x, b1.y); + var c10x2 = c10.x * c10.x; + var c10y2 = c10.y * c10.y; + var c11x2 = c11.x * c11.x; + var c11y2 = c11.y * c11.y; + var c12x2 = c12.x * c12.x; + var c12y2 = c12.y * c12.y; + var c20x2 = c20.x * c20.x; + var c20y2 = c20.y * c20.y; + var c21x2 = c21.x * c21.x; + var c21y2 = c21.y * c21.y; + var c22x2 = c22.x * c22.x; + var c22y2 = c22.y * c22.y; + var c23x2 = c23.x * c23.x; + var c23y2 = c23.y * c23.y; + var poly = new Polynomial(-2 * c12.x * c12.y * c23.x * c23.y + c12x2 * c23y2 + c12y2 * c23x2, -2 * c12.x * c12.y * c22.x * c23.y - 2 * c12.x * c12.y * c22.y * c23.x + 2 * c12y2 * c22.x * c23.x + 2 * c12x2 * c22.y * c23.y, -2 * c12.x * c21.x * c12.y * c23.y - 2 * c12.x * c12.y * c21.y * c23.x - 2 * c12.x * c12.y * c22.x * c22.y + 2 * c21.x * c12y2 * c23.x + c12y2 * c22x2 + c12x2 * (2 * c21.y * c23.y + c22y2), 2 * c10.x * c12.x * c12.y * c23.y + 2 * c10.y * c12.x * c12.y * c23.x + c11.x * c11.y * c12.x * c23.y + c11.x * c11.y * c12.y * c23.x - 2 * c20.x * c12.x * c12.y * c23.y - 2 * c12.x * c20.y * c12.y * c23.x - 2 * c12.x * c21.x * c12.y * c22.y - 2 * c12.x * c12.y * c21.y * c22.x - 2 * c10.x * c12y2 * c23.x - 2 * c10.y * c12x2 * c23.y + 2 * c20.x * c12y2 * c23.x + 2 * c21.x * c12y2 * c22.x - c11y2 * c12.x * c23.x - c11x2 * c12.y * c23.y + c12x2 * (2 * c20.y * c23.y + 2 * c21.y * c22.y), 2 * c10.x * c12.x * c12.y * c22.y + 2 * c10.y * c12.x * c12.y * c22.x + c11.x * c11.y * c12.x * c22.y + c11.x * c11.y * c12.y * c22.x - 2 * c20.x * c12.x * c12.y * c22.y - 2 * c12.x * c20.y * c12.y * c22.x - 2 * c12.x * c21.x * c12.y * c21.y - 2 * c10.x * c12y2 * c22.x - 2 * c10.y * c12x2 * c22.y + 2 * c20.x * c12y2 * c22.x - c11y2 * c12.x * c22.x - c11x2 * c12.y * c22.y + c21x2 * c12y2 + c12x2 * (2 * c20.y * c22.y + c21y2), 2 * c10.x * c12.x * c12.y * c21.y + 2 * c10.y * c12.x * c21.x * c12.y + c11.x * c11.y * c12.x * c21.y + c11.x * c11.y * c21.x * c12.y - 2 * c20.x * c12.x * c12.y * c21.y - 2 * c12.x * c20.y * c21.x * c12.y - 2 * c10.x * c21.x * c12y2 - 2 * c10.y * c12x2 * c21.y + 2 * c20.x * c21.x * c12y2 - c11y2 * c12.x * c21.x - c11x2 * c12.y * c21.y + 2 * c12x2 * c20.y * c21.y, -2 * c10.x * c10.y * c12.x * c12.y - c10.x * c11.x * c11.y * c12.y - c10.y * c11.x * c11.y * c12.x + 2 * c10.x * c12.x * c20.y * c12.y + 2 * c10.y * c20.x * c12.x * c12.y + c11.x * c20.x * c11.y * c12.y + c11.x * c11.y * c12.x * c20.y - 2 * c20.x * c12.x * c20.y * c12.y - 2 * c10.x * c20.x * c12y2 + c10.x * c11y2 * c12.x + c10.y * c11x2 * c12.y - 2 * c10.y * c12x2 * c20.y - c20.x * c11y2 * c12.x - c11x2 * c20.y * c12.y + c10x2 * c12y2 + c10y2 * c12x2 + c20x2 * c12y2 + c12x2 * c20y2); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = roots[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var s = _step4.value; + var xRoots = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x).getRoots(); + var yRoots = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y).getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + checkRoots: for (var _iterator5 = xRoots[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var xRoot = _step5.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Circle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} c + * @param {number} r + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Circle = function (p1, p2, p3, c, r) { + return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r); + }; + /** + * intersectBezier2Ellipse + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Ellipse = function (p1, p2, p3, ec, rx, ry) { + var a; // temporary variables + // c2, c1, c0; // coefficients of quadratic + + var result = new Intersection("No Intersection"); + a = p2.multiply(-2); + var c2 = p1.add(a.add(p3)); + a = p1.multiply(-2); + var b = p2.multiply(2); + var c1 = a.add(b); + var c0 = new Point2D(p1.x, p1.y); + var rxrx = rx * rx; + var ryry = ry * ry; + var roots = new Polynomial(ryry * c2.x * c2.x + rxrx * c2.y * c2.y, 2 * (ryry * c2.x * c1.x + rxrx * c2.y * c1.y), ryry * (2 * c2.x * c0.x + c1.x * c1.x) + rxrx * (2 * c2.y * c0.y + c1.y * c1.y) - 2 * (ryry * ec.x * c2.x + rxrx * ec.y * c2.y), 2 * (ryry * c1.x * (c0.x - ec.x) + rxrx * c1.y * (c0.y - ec.y)), ryry * (c0.x * c0.x + ec.x * ec.x) + rxrx * (c0.y * c0.y + ec.y * ec.y) - 2 * (ryry * ec.x * c0.x + rxrx * ec.y * c0.y) - rxrx * ryry).getRoots(); + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = roots[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var t = _step6.value; + + if (0 <= t && t <= 1) { + result.points.push(c2.multiply(t * t).add(c1.multiply(t).add(c0))); + } + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Line + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Line = function (p1, p2, p3, a1, a2) { + var a; // temporary variables + // let c2, c1, c0; // coefficients of quadratic + // cl; // c coefficient for normal form of line + // n; // normal for normal form of line + + var min = a1.min(a2); // used to determine if point is on line segment + + var max = a1.max(a2); // used to determine if point is on line segment + + var result = new Intersection("No Intersection"); + a = p2.multiply(-2); + var c2 = p1.add(a.add(p3)); + a = p1.multiply(-2); + var b = p2.multiply(2); + var c1 = a.add(b); + var c0 = new Point2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 + // Find normal to line: negative inverse of original line's slope + + var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient + + var cl = a1.x * a2.y - a2.x * a1.y; // Transform cubic coefficients to line's coordinate system and find roots + // of cubic + + var roots = new Polynomial(n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but + // might not be on the line segment. + // Find intersections and calculate point coordinates + + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = roots[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var t = _step7.value; + + if (0 <= t && t <= 1) { + // We're within the Bezier curve + // Find point on Bezier + var p4 = p1.lerp(p2, t); + var p5 = p2.lerp(p3, t); + var p6 = p4.lerp(p5, t); // See if point is on line segment + // Had to make special cases for vertical and horizontal lines due + // to slight errors in calculation of p6 + + if (a1.x == a2.x) { + if (min.y <= p6.y && p6.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } else if (a1.y == a2.y) { + if (min.x <= p6.x && p6.x <= max.x) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + + return result; + }; + /** + * intersectBezier2Polygon + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Polygon = function (p1, p2, p3, points) { + return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points)); + }; + /** + * intersectBezier2Polyline + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Polyline = function (p1, p2, p3, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + var inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Rectangle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Rectangle = function (p1, p2, p3, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight); + var inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max); + var inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft); + var inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Bezier3 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} a4 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @param {Point2D} b4 + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Bezier3 = function (a1, a2, a3, a4, b1, b2, b3, b4) { + var a, b, c, d; // temporary variables + // c13, c12, c11, c10; // coefficients of cubic + // c23, c22, c21, c20; // coefficients of cubic + + var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial + + a = a1.multiply(-1); + b = a2.multiply(3); + c = a3.multiply(-3); + d = a.add(b.add(c.add(a4))); + var c13 = new Vector2D(d.x, d.y); + a = a1.multiply(3); + b = a2.multiply(-6); + c = a3.multiply(3); + d = a.add(b.add(c)); + var c12 = new Vector2D(d.x, d.y); + a = a1.multiply(-3); + b = a2.multiply(3); + c = a.add(b); + var c11 = new Vector2D(c.x, c.y); + var c10 = new Vector2D(a1.x, a1.y); + a = b1.multiply(-1); + b = b2.multiply(3); + c = b3.multiply(-3); + d = a.add(b.add(c.add(b4))); + var c23 = new Vector2D(d.x, d.y); + a = b1.multiply(3); + b = b2.multiply(-6); + c = b3.multiply(3); + d = a.add(b.add(c)); + var c22 = new Vector2D(d.x, d.y); + a = b1.multiply(-3); + b = b2.multiply(3); + c = a.add(b); + var c21 = new Vector2D(c.x, c.y); + var c20 = new Vector2D(b1.x, b1.y); // bezout + + a = c13.x * c12.y - c12.x * c13.y; + b = c13.x * c11.y - c11.x * c13.y; + var c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var c1 = c21.x * c13.y - c13.x * c21.y; + var c2 = c22.x * c13.y - c13.x * c22.y; + var c3 = c23.x * c13.y - c13.x * c23.y; + d = c13.x * c11.y - c11.x * c13.y; + var e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var e1 = c21.x * c13.y - c13.x * c21.y; + var e2 = c22.x * c13.y - c13.x * c22.y; + var e3 = c23.x * c13.y - c13.x * c23.y; + var f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; + var f1 = c21.x * c12.y - c12.x * c21.y; + var f2 = c22.x * c12.y - c12.x * c22.y; + var f3 = c23.x * c12.y - c12.x * c23.y; + var g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var g1 = c21.x * c13.y - c13.x * c21.y; + var g2 = c22.x * c13.y - c13.x * c22.y; + var g3 = c23.x * c13.y - c13.x * c23.y; + var h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; + var h1 = c21.x * c12.y - c12.x * c21.y; + var h2 = c22.x * c12.y - c12.x * c22.y; + var h3 = c23.x * c12.y - c12.x * c23.y; + var i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y; + var i1 = c21.x * c11.y - c11.x * c21.y; + var i2 = c22.x * c11.y - c11.x * c22.y; + var i3 = c23.x * c11.y - c11.x * c23.y; // determinant + + var poly = new Polynomial(-c3 * e3 * g3, -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3, -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3, -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3, -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3, -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3, -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3, -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2, -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1, -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0); + poly.simplify(); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; + + try { + for (var _iterator8 = roots[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var s = _step8.value; + var xp = new Polynomial(c13.x, c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x); + xp.simplify(); + var xRoots = xp.getRoots(); + var yp = new Polynomial(c13.y, c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y); + yp.simplify(); + var yRoots = yp.getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; + + try { + checkRoots: for (var _iterator9 = xRoots[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { + var xRoot = _step9.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError9 = true; + _iteratorError9 = err; + } finally { + try { + if (!_iteratorNormalCompletion9 && _iterator9["return"] != null) { + _iterator9["return"](); + } + } finally { + if (_didIteratorError9) { + throw _iteratorError9; + } + } + } + } + } + } catch (err) { + _didIteratorError8 = true; + _iteratorError8 = err; + } finally { + try { + if (!_iteratorNormalCompletion8 && _iterator8["return"] != null) { + _iterator8["return"](); + } + } finally { + if (_didIteratorError8) { + throw _iteratorError8; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Circle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} c + * @param {number} r + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Circle = function (p1, p2, p3, p4, c, r) { + return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r); + }; + /** + * intersectBezier3Ellipse + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Ellipse = function (p1, p2, p3, p4, ec, rx, ry) { + var a, b, c, d; // temporary variables + // c3, c2, c1, c0; // coefficients of cubic + + var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial + + a = p1.multiply(-1); + b = p2.multiply(3); + c = p3.multiply(-3); + d = a.add(b.add(c.add(p4))); + var c3 = new Vector2D(d.x, d.y); + a = p1.multiply(3); + b = p2.multiply(-6); + c = p3.multiply(3); + d = a.add(b.add(c)); + var c2 = new Vector2D(d.x, d.y); + a = p1.multiply(-3); + b = p2.multiply(3); + c = a.add(b); + var c1 = new Vector2D(c.x, c.y); + var c0 = new Vector2D(p1.x, p1.y); + var rxrx = rx * rx; + var ryry = ry * ry; + var poly = new Polynomial(c3.x * c3.x * ryry + c3.y * c3.y * rxrx, 2 * (c3.x * c2.x * ryry + c3.y * c2.y * rxrx), 2 * (c3.x * c1.x * ryry + c3.y * c1.y * rxrx) + c2.x * c2.x * ryry + c2.y * c2.y * rxrx, 2 * c3.x * ryry * (c0.x - ec.x) + 2 * c3.y * rxrx * (c0.y - ec.y) + 2 * (c2.x * c1.x * ryry + c2.y * c1.y * rxrx), 2 * c2.x * ryry * (c0.x - ec.x) + 2 * c2.y * rxrx * (c0.y - ec.y) + c1.x * c1.x * ryry + c1.y * c1.y * rxrx, 2 * c1.x * ryry * (c0.x - ec.x) + 2 * c1.y * rxrx * (c0.y - ec.y), c0.x * c0.x * ryry - 2 * c0.y * ec.y * rxrx - 2 * c0.x * ec.x * ryry + c0.y * c0.y * rxrx + ec.x * ec.x * ryry + ec.y * ec.y * rxrx - rxrx * ryry); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion10 = true; + var _didIteratorError10 = false; + var _iteratorError10 = undefined; + + try { + for (var _iterator10 = roots[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { + var t = _step10.value; + result.points.push(c3.multiply(t * t * t).add(c2.multiply(t * t).add(c1.multiply(t).add(c0)))); + } + } catch (err) { + _didIteratorError10 = true; + _iteratorError10 = err; + } finally { + try { + if (!_iteratorNormalCompletion10 && _iterator10["return"] != null) { + _iterator10["return"](); + } + } finally { + if (_didIteratorError10) { + throw _iteratorError10; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Line + * + * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough + * sketch of the algorithm used here. Without his help, I'm not sure when I + * would have figured out this intersection problem. + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Line = function (p1, p2, p3, p4, a1, a2) { + var a, b, c, d; // temporary variables + // c3, c2, c1, c0; // coefficients of cubic + // cl; // c coefficient for normal form of line + // n; // normal for normal form of line + + var min = a1.min(a2); // used to determine if point is on line segment + + var max = a1.max(a2); // used to determine if point is on line segment + + var result = new Intersection("No Intersection"); // Start with Bezier using Bernstein polynomials for weighting functions: + // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4 + // + // Expand and collect terms to form linear combinations of original Bezier + // controls. This ends up with a vector cubic in t: + // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1 + // /\ /\ /\ /\ + // || || || || + // c3 c2 c1 c0 + // Calculate the coefficients + + a = p1.multiply(-1); + b = p2.multiply(3); + c = p3.multiply(-3); + d = a.add(b.add(c.add(p4))); + var c3 = new Vector2D(d.x, d.y); + a = p1.multiply(3); + b = p2.multiply(-6); + c = p3.multiply(3); + d = a.add(b.add(c)); + var c2 = new Vector2D(d.x, d.y); + a = p1.multiply(-3); + b = p2.multiply(3); + c = a.add(b); + var c1 = new Vector2D(c.x, c.y); + var c0 = new Vector2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 + // Find normal to line: negative inverse of original line's slope + + var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient + + var cl = a1.x * a2.y - a2.x * a1.y; // ?Rotate each cubic coefficient using line for new coordinate system? + // Find roots of rotated cubic + + var roots = new Polynomial(n.dot(c3), n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but + // might not be on the line segment. + // Find intersections and calculate point coordinates + + var _iteratorNormalCompletion11 = true; + var _didIteratorError11 = false; + var _iteratorError11 = undefined; + + try { + for (var _iterator11 = roots[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { + var t = _step11.value; + + if (0 <= t && t <= 1) { + // We're within the Bezier curve + // Find point on Bezier + var p5 = p1.lerp(p2, t); + var p6 = p2.lerp(p3, t); + var p7 = p3.lerp(p4, t); + var p8 = p5.lerp(p6, t); + var p9 = p6.lerp(p7, t); + var p10 = p8.lerp(p9, t); // See if point is on line segment + // Had to make special cases for vertical and horizontal lines due + // to slight errors in calculation of p10 + + if (a1.x == a2.x) { + if (min.y <= p10.y && p10.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } else if (a1.y == a2.y) { + if (min.x <= p10.x && p10.x <= max.x) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } + } + } catch (err) { + _didIteratorError11 = true; + _iteratorError11 = err; + } finally { + try { + if (!_iteratorNormalCompletion11 && _iterator11["return"] != null) { + _iterator11["return"](); + } + } finally { + if (_didIteratorError11) { + throw _iteratorError11; + } + } + } + + return result; + }; + /** + * intersectBezier3Polygon + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Polygon = function (p1, p2, p3, p4, points) { + return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points)); + }; + /** + * intersectBezier3Polyline + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Polyline = function (p1, p2, p3, p4, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + var inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Rectangle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Rectangle = function (p1, p2, p3, p4, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight); + var inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max); + var inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft); + var inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectCircleCircle + * + * @param {Point2D} c1 + * @param {number} r1 + * @param {Point2D} c2 + * @param {number} r2 + * @returns {Intersection} + */ + + + Intersection.intersectCircleCircle = function (c1, r1, c2, r2) { + var result; // Determine minimum and maximum radii where circles can intersect + + var r_max = r1 + r2; + var r_min = Math.abs(r1 - r2); // Determine actual distance between circle circles + + var c_dist = c1.distanceFrom(c2); + + if (c_dist > r_max) { + result = new Intersection("Outside"); + } else if (c_dist < r_min) { + result = new Intersection("Inside"); + } else { + result = new Intersection("Intersection"); + var a = (r1 * r1 - r2 * r2 + c_dist * c_dist) / (2 * c_dist); + var h = Math.sqrt(r1 * r1 - a * a); + var p = c1.lerp(c2, a / c_dist); + var b = h / c_dist; + result.points.push(new Point2D(p.x - b * (c2.y - c1.y), p.y + b * (c2.x - c1.x))); + result.points.push(new Point2D(p.x + b * (c2.y - c1.y), p.y - b * (c2.x - c1.x))); + } + + return result; + }; + /** + * intersectCircleEllipse + * + * @param {Point2D} cc + * @param {number} r + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + + Intersection.intersectCircleEllipse = function (cc, r, ec, rx, ry) { + return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry); + }; + /** + * intersectCircleLine + * + * @param {Point2D} c + * @param {number} r + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectCircleLine = function (c, r, a1, a2) { + var result; + var a = (a2.x - a1.x) * (a2.x - a1.x) + (a2.y - a1.y) * (a2.y - a1.y); + var b = 2 * ((a2.x - a1.x) * (a1.x - c.x) + (a2.y - a1.y) * (a1.y - c.y)); + var cc = c.x * c.x + c.y * c.y + a1.x * a1.x + a1.y * a1.y - 2 * (c.x * a1.x + c.y * a1.y) - r * r; + var deter = b * b - 4 * a * cc; + + if (deter < 0) { + result = new Intersection("Outside"); + } else if (deter == 0) { + result = new Intersection("Tangent"); // NOTE: should calculate this point + } else { + var e = Math.sqrt(deter); + var u1 = (-b + e) / (2 * a); + var u2 = (-b - e) / (2 * a); + + if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) { + if (u1 < 0 && u2 < 0 || u1 > 1 && u2 > 1) { + result = new Intersection("Outside"); + } else { + result = new Intersection("Inside"); + } + } else { + result = new Intersection("Intersection"); + + if (0 <= u1 && u1 <= 1) { + result.points.push(a1.lerp(a2, u1)); + } + + if (0 <= u2 && u2 <= 1) { + result.points.push(a1.lerp(a2, u2)); + } + } + } + + return result; + }; + /** + * intersectCirclePolygon + * + * @param {Point2D} c + * @param {number} r + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectCirclePolygon = function (c, r, points) { + return this.intersectCirclePolyline(c, r, closePolygon(points)); + }; + /** + * intersectCirclePolyline + * + * @param {Point2D} c + * @param {number} r + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectCirclePolyline = function (c, r, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + var inter; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + inter = Intersection.intersectCircleLine(c, r, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } else { + result.status = inter.status; + } + + return result; + }; + /** + * intersectCircleRectangle + * + * @param {Point2D} c + * @param {number} r + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectCircleRectangle = function (c, r, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectCircleLine(c, r, min, topRight); + var inter2 = Intersection.intersectCircleLine(c, r, topRight, max); + var inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft); + var inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } else { + result.status = inter1.status; + } + + return result; + }; + /** + * intersectEllipseEllipse + * + * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.magic-software.com + * + * NOTE: Rotation will need to be added to this function + * + * @param {Point2D} c1 + * @param {number} rx1 + * @param {number} ry1 + * @param {Point2D} c2 + * @param {number} rx2 + * @param {number} ry2 + * @returns {Intersection} + */ + + + Intersection.intersectEllipseEllipse = function (c1, rx1, ry1, c2, rx2, ry2) { + var a = [ry1 * ry1, 0, rx1 * rx1, -2 * ry1 * ry1 * c1.x, -2 * rx1 * rx1 * c1.y, ry1 * ry1 * c1.x * c1.x + rx1 * rx1 * c1.y * c1.y - rx1 * rx1 * ry1 * ry1]; + var b = [ry2 * ry2, 0, rx2 * rx2, -2 * ry2 * ry2 * c2.x, -2 * rx2 * rx2 * c2.y, ry2 * ry2 * c2.x * c2.x + rx2 * rx2 * c2.y * c2.y - rx2 * rx2 * ry2 * ry2]; + var yPoly = Intersection.bezout(a, b); + var yRoots = yPoly.getRoots(); + var epsilon = 1e-3; + var norm0 = (a[0] * a[0] + 2 * a[1] * a[1] + a[2] * a[2]) * epsilon; + var norm1 = (b[0] * b[0] + 2 * b[1] * b[1] + b[2] * b[2]) * epsilon; + var result = new Intersection("No Intersection"); + + for (var y = 0; y < yRoots.length; y++) { + var xPoly = new Polynomial(a[0], a[3] + yRoots[y] * a[1], a[5] + yRoots[y] * (a[4] + yRoots[y] * a[2])); + var xRoots = xPoly.getRoots(); + + for (var x = 0; x < xRoots.length; x++) { + var tst = (a[0] * xRoots[x] + a[1] * yRoots[y] + a[3]) * xRoots[x] + (a[2] * yRoots[y] + a[4]) * yRoots[y] + a[5]; + + if (Math.abs(tst) < norm0) { + tst = (b[0] * xRoots[x] + b[1] * yRoots[y] + b[3]) * xRoots[x] + (b[2] * yRoots[y] + b[4]) * yRoots[y] + b[5]; + + if (Math.abs(tst) < norm1) { + result.appendPoint(new Point2D(xRoots[x], yRoots[y])); + } + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectEllipseLine + * + * NOTE: Rotation will need to be added to this function + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectEllipseLine = function (c, rx, ry, a1, a2) { + var result; + var orign = new Vector2D(a1.x, a1.y); + var dir = Vector2D.fromPoints(a1, a2); + var center = new Vector2D(c.x, c.y); + var diff = orign.subtract(center); + var mDir = new Vector2D(dir.x / (rx * rx), dir.y / (ry * ry)); + var mDiff = new Vector2D(diff.x / (rx * rx), diff.y / (ry * ry)); + var a = dir.dot(mDir); + var b = dir.dot(mDiff); + c = diff.dot(mDiff) - 1.0; + var d = b * b - a * c; + + if (d < 0) { + result = new Intersection("Outside"); + } else if (d > 0) { + var root = Math.sqrt(d); // eslint-disable-line no-shadow + + var t_a = (-b - root) / a; + var t_b = (-b + root) / a; + + if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) { + if (t_a < 0 && t_b < 0 || t_a > 1 && t_b > 1) { + result = new Intersection("Outside"); + } else { + result = new Intersection("Inside"); + } + } else { + result = new Intersection("Intersection"); + + if (0 <= t_a && t_a <= 1) { + result.appendPoint(a1.lerp(a2, t_a)); + } + + if (0 <= t_b && t_b <= 1) { + result.appendPoint(a1.lerp(a2, t_b)); + } + } + } else { + var t = -b / a; + + if (0 <= t && t <= 1) { + result = new Intersection("Intersection"); + result.appendPoint(a1.lerp(a2, t)); + } else { + result = new Intersection("Outside"); + } + } + + return result; + }; + /** + * intersectEllipsePolygon + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectEllipsePolygon = function (c, rx, ry, points) { + return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points)); + }; + /** + * intersectEllipsePolyline + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectEllipsePolyline = function (c, rx, ry, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var b1 = points[i]; + var b2 = points[i + 1]; + var inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectEllipseRectangle + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectEllipseRectangle = function (c, rx, ry, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight); + var inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max); + var inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft); + var inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectLineLine + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + + Intersection.intersectLineLine = function (a1, a2, b1, b2) { + var result; + var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + + if (u_b != 0) { + var ua = ua_t / u_b; + var ub = ub_t / u_b; + + if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { + result = new Intersection("Intersection"); + result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); + } else { + result = new Intersection("No Intersection"); + } + } else if (ua_t == 0 || ub_t == 0) { + result = new Intersection("Coincident"); + } else { + result = new Intersection("Parallel"); + } + + return result; + }; + /** + * intersectLinePolygon + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectLinePolygon = function (a1, a2, points) { + return this.intersectLinePolyline(a1, a2, closePolygon(points)); + }; + /** + * intersectLinePolyline + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectLinePolyline = function (a1, a2, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var b1 = points[i]; + var b2 = points[i + 1]; + var inter = Intersection.intersectLineLine(a1, a2, b1, b2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectLineRectangle + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectLineRectangle = function (a1, a2, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLineLine(min, topRight, a1, a2); + var inter2 = Intersection.intersectLineLine(topRight, max, a1, a2); + var inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2); + var inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectPolygonPolygon + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + + Intersection.intersectPolygonPolygon = function (points1, points2) { + return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2)); + }; + /** + * intersectPolygonPolyline + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + + Intersection.intersectPolygonPolyline = function (points1, points2) { + return this.intersectPolylinePolyline(closePolygon(points1), points2); + }; + /** + * intersectPolygonRectangle + * + * @param {Array} points + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectPolygonRectangle = function (points, r1, r2) { + return this.intersectPolylineRectangle(closePolygon(points), r1, r2); + }; + /** + * intersectPolylinePolyline + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + + Intersection.intersectPolylinePolyline = function (points1, points2) { + var result = new Intersection("No Intersection"); + var len = points1.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points1[i]; + var a2 = points1[i + 1]; + var inter = Intersection.intersectLinePolyline(a1, a2, points2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectPolylineRectangle + * + * @param {Array} points + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectPolylineRectangle = function (points, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLinePolyline(min, topRight, points); + var inter2 = Intersection.intersectLinePolyline(topRight, max, points); + var inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points); + var inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectRectangleRectangle + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + + Intersection.intersectRectangleRectangle = function (a1, a2, b1, b2) { + var min = a1.min(a2); + var max = a1.max(a2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2); + var inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2); + var inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2); + var inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectRayRay + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + + Intersection.intersectRayRay = function (a1, a2, b1, b2) { + var result; + var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + + if (u_b != 0) { + var ua = ua_t / u_b; + result = new Intersection("Intersection"); + result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); + } else if (ua_t == 0 || ub_t == 0) { + result = new Intersection("Coincident"); + } else { + result = new Intersection("Parallel"); + } + + return result; + }; + /** + * bezout + * + * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.magic-software.com + * + * @param {Array} e1 + * @param {Array} e2 + * @returns {Polynomial} + */ + + + Intersection.bezout = function (e1, e2) { + var AB = e1[0] * e2[1] - e2[0] * e1[1]; + var AC = e1[0] * e2[2] - e2[0] * e1[2]; + var AD = e1[0] * e2[3] - e2[0] * e1[3]; + var AE = e1[0] * e2[4] - e2[0] * e1[4]; + var AF = e1[0] * e2[5] - e2[0] * e1[5]; + var BC = e1[1] * e2[2] - e2[1] * e1[2]; + var BE = e1[1] * e2[4] - e2[1] * e1[4]; + var BF = e1[1] * e2[5] - e2[1] * e1[5]; + var CD = e1[2] * e2[3] - e2[2] * e1[3]; + var DE = e1[3] * e2[4] - e2[3] * e1[4]; + var DF = e1[3] * e2[5] - e2[3] * e1[5]; + var BFpDE = BF + DE; + var BEmCD = BE - CD; + return new Polynomial(AB * BC - AC * AC, AB * BEmCD + AD * BC - 2 * AC * AE, AB * BFpDE + AD * BEmCD - AE * AE - 2 * AC * AF, AB * DF + AD * BFpDE - 2 * AE * AF, AD * DF - AF * AF); + }; + + /** + * + * IntersectionArgs.js + * + * @copyright 2002, 2017 Kevin Lindsey + * + */ + + /** + * IntersectionArgs + * + * @param {string} name + * @param {Array} args + * @returns {IntersectionArgs} + */ + function IntersectionArgs(name, args) { + this.init(name, args); + } + /** + * init + * + * @param {string} name + * @param {Array} args + */ + + + IntersectionArgs.prototype.init = function (name, args) { + this.name = name; + this.args = args; + }; + + /** + * Shapes + * + * @copyright 2017, Kevin Lindsey + */ + var Shapes = {}; + /** + * quadraticBezier + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @param {number} p3x + * @param {number} p3y + * @returns {IntersectionArgs} + */ + + Shapes.quadraticBezier = function (p1x, p1y, p2x, p2y, p3x, p3y) { + return new IntersectionArgs("Bezier2", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y)]); + }; + /** + * cubicBezier + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @param {number} p3x + * @param {number} p3y + * @param {number} p4x + * @param {number} p4y + * @returns {IntersectionArgs} + */ + + + Shapes.cubicBezier = function (p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { + return new IntersectionArgs("Bezier3", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y), new Point2D(p4x, p4y)]); + }; + /** + * circle + * + * @param {number} centerX + * @param {number} centerY + * @param {number} radius + * @returns {IntersectionArgs} + */ + + + Shapes.circle = function (centerX, centerY, radius) { + return new IntersectionArgs("Circle", [new Point2D(centerX, centerY), radius]); + }; + /** + * ellipse + * + * @param {number} centerX + * @param {number} centerY + * @param {number} radiusX + * @param {number} radiusY + * @returns {IntersectionArgs} + */ + + + Shapes.ellipse = function (centerX, centerY, radiusX, radiusY) { + return new IntersectionArgs("Ellipse", [new Point2D(centerX, centerY), radiusX, radiusY]); + }; + /** + * line + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @returns {IntersectionArgs} + */ + + + Shapes.line = function (p1x, p1y, p2x, p2y) { + return new IntersectionArgs("Line", [new Point2D(p1x, p1y), new Point2D(p2x, p2y)]); + }; + /** + * path + * + * @param {Array} segments + * @returns {IntersectionArgs} + */ + + + Shapes.path = function (segments) { + return new IntersectionArgs("Path", segments); + }; + /** + * polygon + * + * @param {Array} coords + * @returns {IntersectionArgs} + */ + + + Shapes.polygon = function (coords) { + var points = []; + + for (var i = 0; i < coords.length; i += 2) { + points.push(new Point2D(coords[i], coords[i + 1])); + } + + return new IntersectionArgs("Polygon", [points]); + }; + /** + * polyline + * + * @param {Array} coords + * @returns {IntersectionArgs} + */ + + + Shapes.polyline = function (coords) { + var points = []; + + for (var i = 0; i < coords.length; i += 2) { + points.push(new Point2D(coords[i], coords[i + 1])); + } + + return new IntersectionArgs("Polyline", [points]); + }; + /** + * rectangle + * + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + * @returns {IntersectionArgs} + */ + + + Shapes.rectangle = function (x, y, width, height) { + return new IntersectionArgs("Rectangle", [new Point2D(x, y), new Point2D(x + width, y + height)]); + }; + + /** + * AffineShapes + * + * @copyright 2017, Kevin Lindsey + */ + var AffineShapes = {}; + /** + * quadraticBezier + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @returns {IntersectionArgs} + */ + + AffineShapes.quadraticBezier = function (p1, p2, p3) { + return new IntersectionArgs("Bezier2", [p1, p2, p3]); + }; + /** + * cubicBezier + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @returns {IntersectionArgs} + */ + + + AffineShapes.cubicBezier = function (p1, p2, p3, p4) { + return new IntersectionArgs("Bezier3", [p1, p2, p3, p4]); + }; + /** + * circle + * + * @param {Point2D} center + * @param {number} radius + * @returns {IntersectionArgs} + */ + + + AffineShapes.circle = function (center, radius) { + return new IntersectionArgs("Circle", [center, radius]); + }; + /** + * ellipse + * + * @param {Point2D} center + * @param {number} radiusX + * @param {number} radiusY + * @returns {IntersectionArgs} + */ + + + AffineShapes.ellipse = function (center, radiusX, radiusY) { + return new IntersectionArgs("Ellipse", [center, radiusX, radiusY]); + }; + /** + * line + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @returns {IntersectionArgs} + */ + + + AffineShapes.line = function (p1, p2) { + return new IntersectionArgs("Line", [p1, p2]); + }; + /** + * path + * + * @param {Array} segments + * @returns {IntersectionArgs} + */ + + + AffineShapes.path = function (segments) { + return new IntersectionArgs("Path", [segments]); + }; + /** + * polygon + * + * @param {Array} points + * @returns {IntersectionArgs} + */ + + + AffineShapes.polygon = function (points) { + return new IntersectionArgs("Polygon", [points]); + }; + /** + * polyline + * + * @param {Array} points + * @returns {IntersectionArgs} + */ + + + AffineShapes.polyline = function (points) { + return new IntersectionArgs("Polyline", [points]); + }; + /** + * rectangle + * + * @param {Point2D} topLeft + * @param {Vector2D} size + * @returns {IntersectionArgs} + */ + + + AffineShapes.rectangle = function (topLeft, size) { + return new IntersectionArgs("Rectangle", [topLeft, topLeft.add(size)]); + }; + + /** + * + * IntersectionQuery.js + * + * @copyright 2017 Kevin Lindsey + * + */ + /** + * + */ + + var IntersectionQuery = {}; + /** + * pointInCircle + * + * @param {Point2D} point + * @param {Point2D} center + * @param {number} radius + * @returns {boolean} + */ + + IntersectionQuery.pointInCircle = function (point, center, radius) { + var v = Vector2D.fromPoints(center, point); + return v.length() <= radius; + }; + /** + * pointInEllipse + * + * @param {Point2D} point + * @param {Point2D} center + * @param {number} radiusX + * @param {number} radiusY + * @returns {boolean} + */ + + + IntersectionQuery.pointInEllipse = function (point, center, radiusX, radiusY) { + var len = point.subtract(center); + return len.x * len.x / (radiusX * radiusX) + len.y * len.y / (radiusY * radiusY) <= 1; + }; + /** + * pointInPolyline + * + * @param {Point2D} point + * @param {Array} points + */ + + + IntersectionQuery.pointInPolyline = function (point, points) { + var len = points.length; + var counter = 0; + var xInter; + var p1 = points[0]; + + for (var i = 1; i <= len; i++) { + var p2 = points[i % len]; + var minY = Math.min(p1.y, p2.y); + var maxY = Math.max(p1.y, p2.y); + var maxX = Math.max(p1.x, p2.x); + + if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) { + xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x; + + if (p1.x === p2.x || point.x <= xInter) { + counter++; + } + } + + p1 = p2; + } + + return counter % 2 === 1; + }; + /** + * pointInPolyline + * + * @param {Point2D} point + * @param {Array} points + */ + + + IntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline; + /** + * pointInRectangle + * + * @param {Point2D} point + * @param {Point2D} topLeft + * @param {Point2D} bottomRight + * @returns {boolean} + */ + + IntersectionQuery.pointInRectangle = function (point, topLeft, bottomRight) { + return topLeft.x <= point.x && point.x < bottomRight.x && topLeft.y <= point.y && point.y < bottomRight.y; + }; + + // expose module classes + + exports.AffineShapes = AffineShapes; + exports.Intersection = Intersection; + exports.IntersectionArgs = IntersectionArgs; + exports.IntersectionQuery = IntersectionQuery; + exports.Matrix2D = Matrix2D; + exports.Point2D = Point2D; + exports.Shapes = Shapes; + exports.Vector2D = Vector2D; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/dist/index-umd.min.js b/dist/index-umd.min.js new file mode 100644 index 0000000..6010e02 --- /dev/null +++ b/dist/index-umd.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).KldIntersections={})}(this,function(t){"use strict";function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n=e(function(t){function e(t,e){Object.defineProperties(this,{x:{value:void 0!==t?t:0,writable:!1,enumerable:!0,configurable:!1},y:{value:void 0!==e?e:0,writable:!1,enumerable:!0,configurable:!1}})}e.prototype.clone=function(){return new this.constructor(this.x,this.y)},e.prototype.add=function(t){return new this.constructor(this.x+t.x,this.y+t.y)},e.prototype.subtract=function(t){return new this.constructor(this.x-t.x,this.y-t.y)},e.prototype.multiply=function(t){return new this.constructor(this.x*t,this.y*t)},e.prototype.divide=function(t){return new this.constructor(this.x/t,this.y/t)},e.prototype.equals=function(t){return this.x===t.x&&this.y===t.y},e.prototype.precisionEquals=function(t,e){return Math.abs(this.x-t.x)=0;e--)this.coefs.push(t[e]);this._variable="t",this._s=0},e.prototype.eval=function(t){if(isNaN(t))throw new Error("Polynomial.eval: parameter must be a number");for(var e=0,n=this.coefs.length-1;n>=0;n--)e=e*t+this.coefs[n];return e},e.prototype.add=function(t){for(var n=new e,i=this.getDegree(),r=t.getDegree(),s=Math.max(i,r),o=0;o<=s;o++){var a=o<=i?this.coefs[o]:0,y=o<=r?t.coefs[o]:0;n.coefs[o]=a+y}return n},e.prototype.multiply=function(t){for(var n=new e,i=0;i<=this.getDegree()+t.getDegree();i++)n.coefs.push(0);for(i=0;i<=this.getDegree();i++)for(var r=0;r<=t.getDegree();r++)n.coefs[i+r]+=this.coefs[i]*t.coefs[r];return n},e.prototype.divide_scalar=function(t){for(var e=0;e=0&&Math.abs(this.coefs[e])<=t;e--)this.coefs.pop()},e.prototype.bisection=function(t,n){var i,r=this.eval(t),s=this.eval(n);if(Math.abs(r)<=e.TOLERANCE)i=t;else if(Math.abs(s)<=e.TOLERANCE)i=n;else if(r*s<=0)for(var o=Math.log(n-t),a=Math.LN10*e.ACCURACY,y=Math.ceil((o+a)/Math.LN2),u=0;u=0;n--){var i=Math.round(1e3*this.coefs[n])/1e3;if(0!=i){var r=i<0?" - ":" + ";i=Math.abs(i),n>0&&(1==i?i=this._variable:i+=this._variable),n>1&&(i+="^"+n),e.push(r),t.push(i)}}e[0]=" + "==e[0]?"":"-";var s="";for(n=0;n=3&&(s=e.interpolate(r,i,3,o-3,0),Math.abs(s.dy)<=1e-6*s.y)));o++)i[o]=i[o-1],r[o]=.25*r[o-1];return s.y},e.prototype.getDegree=function(){return this.coefs.length-1},e.prototype.getDerivative=function(){for(var t=new e,n=1;n0){for(null!=(n=this.bisection(t,s[0]))&&r.push(n),i=0;i<=s.length-2;i++)null!=(n=this.bisection(s[i],s[i+1]))&&r.push(n);null!=(n=this.bisection(s[s.length-1],e))&&r.push(n)}else null!=(n=this.bisection(t,e))&&r.push(n)}return r},e.prototype.getLinearRoot=function(){var t=[],e=this.coefs[1];return 0!=e&&t.push(-this.coefs[0]/e),t},e.prototype.getQuadraticRoots=function(){var t=[];if(2==this.getDegree()){var e=this.coefs[2],n=this.coefs[1]/e,i=n*n-4*(this.coefs[0]/e);if(i>0){var r=Math.sqrt(i);t.push(.5*(-n+r)),t.push(.5*(-n-r))}else 0==i&&t.push(.5*-n)}return t},e.prototype.getCubicRoots=function(){var t=[];if(3==this.getDegree()){var e=this.coefs[3],n=this.coefs[2]/e,i=this.coefs[1]/e,r=(3*i-n*n)/3,s=(2*n*n*n-9*i*n+27*(this.coefs[0]/e))/27,o=n/3,a=s*s/4+r*r*r/27,y=s/2,u=this.zeroErrorEstimate();if(Math.abs(a)<=u&&(a=0),a>0){var c,h=Math.sqrt(a);c=(v=-y+h)>=0?Math.pow(v,1/3):-Math.pow(-v,1/3),(v=-y-h)>=0?c+=Math.pow(v,1/3):c-=Math.pow(-v,1/3),t.push(c-o)}else if(a<0){var l=Math.sqrt(-r/3),p=Math.atan2(Math.sqrt(-a),-y)/3,x=Math.cos(p),f=Math.sin(p),d=Math.sqrt(3);t.push(2*l*x-o),t.push(-l*(x+d*f)-o),t.push(-l*(x-d*f)-o)}else{var v;v=y>=0?-Math.pow(y,1/3):Math.pow(-y,1/3),t.push(2*v-o),t.push(-v-o)}}return t};var n=function(t){return"number"==typeof t?t?t<0?-1:1:t==t?t:NaN:NaN};e.prototype.getQuarticRoots=function(){var t=[],i=this.getDegree();if(4==i){var r=new e;r.coefs=this.coefs.slice(),r.divide_scalar(r.coefs[i]);Math.abs(r.coefs[0])<10*1e-15*Math.abs(r.coefs[3])&&(r.coefs[0]=0);var s,o=r.getDerivative(),a=o.getRoots().sort(function(t,e){return t-e}),y=[],u=a.length-1,c=this.bounds();maxabsX=Math.max(Math.abs(c.minX),Math.abs(c.maxX));var h=this.zeroErrorEstimate(maxabsX);for(s=0;s<=u;s++)y.push(r.eval(a[s]));for(s=0;s<=u;s++)Math.abs(y[s])-1){for(0!=y[0]?n(y[0])!=n(r.eval(a[0]-l)-y[0])&&(p.push(a[0]-l),x.push([c.minX,a[0]])):(t.push(a[0],a[0]),s++);s0)for(s=0;se?s:e},0)},e.prototype.bounds_UpperReal_Fujiwara=function(){var t=this.coefs,e=t.length-1,n=t[e];1!=n&&(t=this.coefs.map(function(t){return t/n}));var i,r=t.map(function(t,n){return n0)},{negX:-2*r.reduce(s,{max:0,nearmax:0}).max,posX:2*o.max}},e.prototype.bounds_LowerReal_Fujiwara=function(){var t=new e;t.coefs=this.coefs.slice().reverse();var n=t.bounds_UpperReal_Fujiwara();return n.negX=1/n.negX,n.posX=1/n.posX,n},e.prototype.bounds=function(){var t=this.bounds_UpperReal_Fujiwara(),e={minX:t.negX,maxX:t.posX};return 0===t.negX&&0===t.posX?e:(0===t.negX?e.minX=this.bounds_LowerReal_Fujiwara().posX:0===t.posX&&(e.maxX=this.bounds_LowerReal_Fujiwara().negX),e.minX>e.maxX&&(e.minX=e.maxX=0),e)},e.newton_secant_bisection=function(t,e,i,r,s,o){var a,u,c,h,l,p,x=0,f=0;a=t;var d=Math.pow(10,-14),v="number"==typeof s&&"number"==typeof o;if(v){if(s>o)throw new Error("newton root finding: min must be greater than max");if(l=e(s),p=e(o),n(l)==n(p))throw new Error("newton root finding: y values of bounds must be of opposite sign")}var w,m=function(){return Math.abs(c)<=d*Math.abs(a)||f==a-c-a};for(w=0;wo){if(n(l)==n(p))break;var g=p-l,b=o-s;if(c=0==g?a-(s+.5*b):Math.abs(g/Math.min(l,p))>50?a-(s+b*(.5+(Math.abs(l)0&&(n.status="Intersection"),n},x.intersectBezier2Bezier2=function(t,e,n,i,r,s){var a,y,u=new x("No Intersection");a=e.multiply(-2);var c=t.add(a.add(n));a=t.multiply(-2),y=e.multiply(2);var l=a.add(y),p=new o(t.x,t.y);a=r.multiply(-2);var f=i.add(a.add(s));a=i.multiply(-2),y=r.multiply(2);var d=a.add(y),v=new o(i.x,i.y);a=c.x*l.y-l.x*c.y,y=f.x*l.y-l.x*f.y;var w=d.x*l.y-l.x*d.y,m=l.x*(p.y-v.y)+l.y*(-p.x+v.x),g=f.x*c.y-c.x*f.y,b=d.x*c.y-c.x*d.y,P=c.x*(p.y-v.y)+c.y*(-p.x+v.x),M=new h(-g*g,-2*g*b,a*y-b*b-2*g*P,a*w-2*b*P,a*m-P*P).getRoots(),I=!0,N=!1,L=void 0;try{for(var R,E=M[Symbol.iterator]();!(I=(R=E.next()).done);I=!0){var z=R.value;if(0<=z&&z<=1){var B=new h(c.x,l.x,p.x-v.x-z*d.x-z*z*f.x);B.simplify();var X=B.getRoots(),C=new h(c.y,l.y,p.y-v.y-z*d.y-z*z*f.y);C.simplify();var _=C.getRoots();if(X.length>0&&_.length>0){var S=!0,q=!1,A=void 0;try{t:for(var D,k=X[Symbol.iterator]();!(S=(D=k.next()).done);S=!0){var O=D.value;if(0<=O&&O<=1)for(var j=0;j<_.length;j++)if(Math.abs(O-_[j])<1e-4){u.points.push(f.multiply(z*z).add(d.multiply(z).add(v)));break t}}}catch(t){q=!0,A=t}finally{try{S||null==k.return||k.return()}finally{if(q)throw A}}}}}}catch(t){N=!0,L=t}finally{try{I||null==E.return||E.return()}finally{if(N)throw L}}return u.points.length>0&&(u.status="Intersection"),u},x.intersectBezier2Bezier3=function(t,e,n,i,r,s,y){var u,c,l,p,f=new x("No Intersection");u=e.multiply(-2);var d=t.add(u.add(n));u=t.multiply(-2),c=e.multiply(2);var v=u.add(c),w=new o(t.x,t.y);u=i.multiply(-1),c=r.multiply(3),l=s.multiply(-3),p=u.add(c.add(l.add(y)));var m=new a(p.x,p.y);u=i.multiply(3),c=r.multiply(-6),l=s.multiply(3),p=u.add(c.add(l));var g=new a(p.x,p.y);u=i.multiply(-3),c=r.multiply(3),l=u.add(c);var b=new a(l.x,l.y),P=new a(i.x,i.y),M=w.x*w.x,I=w.y*w.y,N=v.x*v.x,L=v.y*v.y,R=d.x*d.x,E=d.y*d.y,z=P.x*P.x,B=P.y*P.y,X=b.x*b.x,C=b.y*b.y,_=g.x*g.x,S=g.y*g.y,q=m.x*m.x,A=m.y*m.y,D=new h(-2*d.x*d.y*m.x*m.y+R*A+E*q,-2*d.x*d.y*g.x*m.y-2*d.x*d.y*g.y*m.x+2*E*g.x*m.x+2*R*g.y*m.y,-2*d.x*b.x*d.y*m.y-2*d.x*d.y*b.y*m.x-2*d.x*d.y*g.x*g.y+2*b.x*E*m.x+E*_+R*(2*b.y*m.y+S),2*w.x*d.x*d.y*m.y+2*w.y*d.x*d.y*m.x+v.x*v.y*d.x*m.y+v.x*v.y*d.y*m.x-2*P.x*d.x*d.y*m.y-2*d.x*P.y*d.y*m.x-2*d.x*b.x*d.y*g.y-2*d.x*d.y*b.y*g.x-2*w.x*E*m.x-2*w.y*R*m.y+2*P.x*E*m.x+2*b.x*E*g.x-L*d.x*m.x-N*d.y*m.y+R*(2*P.y*m.y+2*b.y*g.y),2*w.x*d.x*d.y*g.y+2*w.y*d.x*d.y*g.x+v.x*v.y*d.x*g.y+v.x*v.y*d.y*g.x-2*P.x*d.x*d.y*g.y-2*d.x*P.y*d.y*g.x-2*d.x*b.x*d.y*b.y-2*w.x*E*g.x-2*w.y*R*g.y+2*P.x*E*g.x-L*d.x*g.x-N*d.y*g.y+X*E+R*(2*P.y*g.y+C),2*w.x*d.x*d.y*b.y+2*w.y*d.x*b.x*d.y+v.x*v.y*d.x*b.y+v.x*v.y*b.x*d.y-2*P.x*d.x*d.y*b.y-2*d.x*P.y*b.x*d.y-2*w.x*b.x*E-2*w.y*R*b.y+2*P.x*b.x*E-L*d.x*b.x-N*d.y*b.y+2*R*P.y*b.y,-2*w.x*w.y*d.x*d.y-w.x*v.x*v.y*d.y-w.y*v.x*v.y*d.x+2*w.x*d.x*P.y*d.y+2*w.y*P.x*d.x*d.y+v.x*P.x*v.y*d.y+v.x*v.y*d.x*P.y-2*P.x*d.x*P.y*d.y-2*w.x*P.x*E+w.x*L*d.x+w.y*N*d.y-2*w.y*R*P.y-P.x*L*d.x-N*P.y*d.y+M*E+I*R+z*E+R*B).getRootsInInterval(0,1),k=!0,O=!1,j=void 0;try{for(var T,F=D[Symbol.iterator]();!(k=(T=F.next()).done);k=!0){var U=T.value,Y=new h(d.x,v.x,w.x-P.x-U*b.x-U*U*g.x-U*U*U*m.x).getRoots(),Q=new h(d.y,v.y,w.y-P.y-U*b.y-U*U*g.y-U*U*U*m.y).getRoots();if(Y.length>0&&Q.length>0){var V=!0,K=!1,G=void 0;try{t:for(var H,J=Y[Symbol.iterator]();!(V=(H=J.next()).done);V=!0){var W=H.value;if(0<=W&&W<=1)for(var Z=0;Z0&&(f.status="Intersection"),f},x.intersectBezier2Circle=function(t,e,n,i,r){return x.intersectBezier2Ellipse(t,e,n,i,r,r)},x.intersectBezier2Ellipse=function(t,e,n,i,r,s){var a,y=new x("No Intersection");a=e.multiply(-2);var u=t.add(a.add(n));a=t.multiply(-2);var c=e.multiply(2),l=a.add(c),p=new o(t.x,t.y),f=r*r,d=s*s,v=new h(d*u.x*u.x+f*u.y*u.y,2*(d*u.x*l.x+f*u.y*l.y),d*(2*u.x*p.x+l.x*l.x)+f*(2*u.y*p.y+l.y*l.y)-2*(d*i.x*u.x+f*i.y*u.y),2*(d*l.x*(p.x-i.x)+f*l.y*(p.y-i.y)),d*(p.x*p.x+i.x*i.x)+f*(p.y*p.y+i.y*i.y)-2*(d*i.x*p.x+f*i.y*p.y)-f*d).getRoots(),w=!0,m=!1,g=void 0;try{for(var b,P=v[Symbol.iterator]();!(w=(b=P.next()).done);w=!0){var M=b.value;0<=M&&M<=1&&y.points.push(u.multiply(M*M).add(l.multiply(M).add(p)))}}catch(t){m=!0,g=t}finally{try{w||null==P.return||P.return()}finally{if(m)throw g}}return y.points.length>0&&(y.status="Intersection"),y},x.intersectBezier2Line=function(t,e,n,i,r){var s,y=i.min(r),u=i.max(r),c=new x("No Intersection");s=e.multiply(-2);var l=t.add(s.add(n));s=t.multiply(-2);var p=e.multiply(2),f=s.add(p),d=new o(t.x,t.y),v=new a(i.y-r.y,r.x-i.x),w=i.x*r.y-r.x*i.y,m=new h(v.dot(l),v.dot(f),v.dot(d)+w).getRoots(),g=!0,b=!1,P=void 0;try{for(var M,I=m[Symbol.iterator]();!(g=(M=I.next()).done);g=!0){var N=M.value;if(0<=N&&N<=1){var L=t.lerp(e,N),R=e.lerp(n,N),E=L.lerp(R,N);i.x==r.x?y.y<=E.y&&E.y<=u.y&&(c.status="Intersection",c.appendPoint(E)):i.y==r.y?y.x<=E.x&&E.x<=u.x&&(c.status="Intersection",c.appendPoint(E)):y.x<=E.x&&E.x<=u.x&&y.y<=E.y&&E.y<=u.y&&(c.status="Intersection",c.appendPoint(E))}}}catch(t){b=!0,P=t}finally{try{g||null==I.return||I.return()}finally{if(b)throw P}}return c},x.intersectBezier2Polygon=function(t,e,n,i){return x.intersectBezier2Polyline(t,e,n,p(i))},x.intersectBezier2Polyline=function(t,e,n,i){for(var r=new x("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},x.intersectBezier2Rectangle=function(t,e,n,i,r){var s=i.min(r),a=i.max(r),y=new o(a.x,s.y),u=new o(s.x,a.y),c=x.intersectBezier2Line(t,e,n,s,y),h=x.intersectBezier2Line(t,e,n,y,a),l=x.intersectBezier2Line(t,e,n,a,u),p=x.intersectBezier2Line(t,e,n,u,s),f=new x("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(p.points),f.points.length>0&&(f.status="Intersection"),f},x.intersectBezier3Bezier3=function(t,e,n,i,r,s,o,y){var u,c,l,p,f=new x("No Intersection");u=t.multiply(-1),c=e.multiply(3),l=n.multiply(-3),p=u.add(c.add(l.add(i)));var d=new a(p.x,p.y);u=t.multiply(3),c=e.multiply(-6),l=n.multiply(3),p=u.add(c.add(l));var v=new a(p.x,p.y);u=t.multiply(-3),c=e.multiply(3),l=u.add(c);var w=new a(l.x,l.y),m=new a(t.x,t.y);u=r.multiply(-1),c=s.multiply(3),l=o.multiply(-3),p=u.add(c.add(l.add(y)));var g=new a(p.x,p.y);u=r.multiply(3),c=s.multiply(-6),l=o.multiply(3),p=u.add(c.add(l));var b=new a(p.x,p.y);u=r.multiply(-3),c=s.multiply(3),l=u.add(c);var P=new a(l.x,l.y),M=new a(r.x,r.y);u=d.x*v.y-v.x*d.y,c=d.x*w.y-w.x*d.y;var I=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,N=P.x*d.y-d.x*P.y,L=b.x*d.y-d.x*b.y,R=g.x*d.y-d.x*g.y;p=d.x*w.y-w.x*d.y;var E=d.x*m.y+v.x*w.y-w.x*v.y-m.x*d.y+M.x*d.y-d.x*M.y,z=P.x*d.y-d.x*P.y,B=b.x*d.y-d.x*b.y,X=g.x*d.y-d.x*g.y,C=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,_=P.x*v.y-v.x*P.y,S=b.x*v.y-v.x*b.y,q=g.x*v.y-v.x*g.y,A=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,D=P.x*d.y-d.x*P.y,k=b.x*d.y-d.x*b.y,O=g.x*d.y-d.x*g.y,j=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,T=P.x*v.y-v.x*P.y,F=b.x*v.y-v.x*b.y,U=g.x*v.y-v.x*g.y,Y=w.x*m.y-m.x*w.y+M.x*w.y-w.x*M.y,Q=P.x*w.y-w.x*P.y,V=b.x*w.y-w.x*b.y,K=g.x*w.y-w.x*g.y,G=new h(-R*X*O,-R*X*k-R*B*O-L*X*O,-R*X*D-R*B*k-L*X*k-R*z*O-L*B*O-N*X*O,-R*X*A-R*B*D-L*X*D-R*z*k-L*B*k-N*X*k-R*E*O-L*z*O-N*B*O-I*X*O+c*q*O+R*p*U-u*q*U+u*X*K,-R*B*A-L*X*A-R*z*D-L*B*D-N*X*D-R*E*k-L*z*k-N*B*k-I*X*k+c*q*k-L*E*O-N*z*O-I*B*O+c*S*O+R*p*F-u*q*F+L*p*U-u*S*U+u*X*V+u*B*K,-R*z*A-L*B*A-N*X*A-R*E*D-L*z*D-N*B*D-I*X*D+c*q*D-L*E*k-N*z*k-I*B*k+c*S*k-N*E*O-I*z*O+c*_*O+R*p*T-u*q*T+L*p*F-u*S*F+N*p*U-u*_*U+u*X*Q+u*B*V+u*z*K,-R*E*A-L*z*A-N*B*A-I*X*A+c*q*A-L*E*D-N*z*D-I*B*D+c*S*D-N*E*k-I*z*k+c*_*k-I*E*O+c*C*O+R*p*j-u*q*j+L*p*T-u*S*T+N*p*F-u*_*F+I*p*U-u*C*U+u*X*Y+u*B*Q+u*z*V-c*p*K+u*E*K,-L*E*A-N*z*A-I*B*A+c*S*A-N*E*D-I*z*D+c*_*D-I*E*k+c*C*k+L*p*j-u*S*j+N*p*T-u*_*T+I*p*F-u*C*F+u*B*Y+u*z*Q-c*p*V+u*E*V,-N*E*A-I*z*A+c*_*A-I*E*D+c*C*D+N*p*j-u*_*j+I*p*T-u*C*T+u*z*Y-c*p*Q+u*E*Q,-I*E*A+c*C*A+I*p*j-u*C*j-c*p*Y+u*E*Y);G.simplify();var H=G.getRootsInInterval(0,1),J=!0,W=!1,Z=void 0;try{for(var $,tt=H[Symbol.iterator]();!(J=($=tt.next()).done);J=!0){var et=$.value,nt=new h(d.x,v.x,w.x,m.x-M.x-et*P.x-et*et*b.x-et*et*et*g.x);nt.simplify();var it=nt.getRoots(),rt=new h(d.y,v.y,w.y,m.y-M.y-et*P.y-et*et*b.y-et*et*et*g.y);rt.simplify();var st=rt.getRoots();if(it.length>0&&st.length>0){var ot=!0,at=!1,yt=void 0;try{t:for(var ut,ct=it[Symbol.iterator]();!(ot=(ut=ct.next()).done);ot=!0){var ht=ut.value;if(0<=ht&&ht<=1)for(var lt=0;lt0&&(f.status="Intersection"),f},x.intersectBezier3Circle=function(t,e,n,i,r,s){return x.intersectBezier3Ellipse(t,e,n,i,r,s,s)},x.intersectBezier3Ellipse=function(t,e,n,i,r,s,o){var y,u,c,l,p=new x("No Intersection");y=t.multiply(-1),u=e.multiply(3),c=n.multiply(-3),l=y.add(u.add(c.add(i)));var f=new a(l.x,l.y);y=t.multiply(3),u=e.multiply(-6),c=n.multiply(3),l=y.add(u.add(c));var d=new a(l.x,l.y);y=t.multiply(-3),u=e.multiply(3),c=y.add(u);var v=new a(c.x,c.y),w=new a(t.x,t.y),m=s*s,g=o*o,b=new h(f.x*f.x*g+f.y*f.y*m,2*(f.x*d.x*g+f.y*d.y*m),2*(f.x*v.x*g+f.y*v.y*m)+d.x*d.x*g+d.y*d.y*m,2*f.x*g*(w.x-r.x)+2*f.y*m*(w.y-r.y)+2*(d.x*v.x*g+d.y*v.y*m),2*d.x*g*(w.x-r.x)+2*d.y*m*(w.y-r.y)+v.x*v.x*g+v.y*v.y*m,2*v.x*g*(w.x-r.x)+2*v.y*m*(w.y-r.y),w.x*w.x*g-2*w.y*r.y*m-2*w.x*r.x*g+w.y*w.y*m+r.x*r.x*g+r.y*r.y*m-m*g).getRootsInInterval(0,1),P=!0,M=!1,I=void 0;try{for(var N,L=b[Symbol.iterator]();!(P=(N=L.next()).done);P=!0){var R=N.value;p.points.push(f.multiply(R*R*R).add(d.multiply(R*R).add(v.multiply(R).add(w))))}}catch(t){M=!0,I=t}finally{try{P||null==L.return||L.return()}finally{if(M)throw I}}return p.points.length>0&&(p.status="Intersection"),p},x.intersectBezier3Line=function(t,e,n,i,r,s){var o,y,u,c,l=r.min(s),p=r.max(s),f=new x("No Intersection");o=t.multiply(-1),y=e.multiply(3),u=n.multiply(-3),c=o.add(y.add(u.add(i)));var d=new a(c.x,c.y);o=t.multiply(3),y=e.multiply(-6),u=n.multiply(3),c=o.add(y.add(u));var v=new a(c.x,c.y);o=t.multiply(-3),y=e.multiply(3),u=o.add(y);var w=new a(u.x,u.y),m=new a(t.x,t.y),g=new a(r.y-s.y,s.x-r.x),b=r.x*s.y-s.x*r.y,P=new h(g.dot(d),g.dot(v),g.dot(w),g.dot(m)+b).getRoots(),M=!0,I=!1,N=void 0;try{for(var L,R=P[Symbol.iterator]();!(M=(L=R.next()).done);M=!0){var E=L.value;if(0<=E&&E<=1){var z=t.lerp(e,E),B=e.lerp(n,E),X=n.lerp(i,E),C=z.lerp(B,E),_=B.lerp(X,E),S=C.lerp(_,E);r.x==s.x?l.y<=S.y&&S.y<=p.y&&(f.status="Intersection",f.appendPoint(S)):r.y==s.y?l.x<=S.x&&S.x<=p.x&&(f.status="Intersection",f.appendPoint(S)):l.x<=S.x&&S.x<=p.x&&l.y<=S.y&&S.y<=p.y&&(f.status="Intersection",f.appendPoint(S))}}}catch(t){I=!0,N=t}finally{try{M||null==R.return||R.return()}finally{if(I)throw N}}return f},x.intersectBezier3Polygon=function(t,e,n,i,r){return this.intersectBezier3Polyline(t,e,n,i,p(r))},x.intersectBezier3Polyline=function(t,e,n,i,r){for(var s=new x("No Intersection"),o=r.length,a=0;a0&&(s.status="Intersection"),s},x.intersectBezier3Rectangle=function(t,e,n,i,r,s){var a=r.min(s),y=r.max(s),u=new o(y.x,a.y),c=new o(a.x,y.y),h=x.intersectBezier3Line(t,e,n,i,a,u),l=x.intersectBezier3Line(t,e,n,i,u,y),p=x.intersectBezier3Line(t,e,n,i,y,c),f=x.intersectBezier3Line(t,e,n,i,c,a),d=new x("No Intersection");return d.appendPoints(h.points),d.appendPoints(l.points),d.appendPoints(p.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d},x.intersectCircleCircle=function(t,e,n,i){var r,s=e+i,a=Math.abs(e-i),y=t.distanceFrom(n);if(y>s)r=new x("Outside");else if(y1)&&(c<0||c>1)?r=new x(u<0&&c<0||u>1&&c>1?"Outside":"Inside"):(r=new x("Intersection"),0<=u&&u<=1&&r.points.push(n.lerp(i,u)),0<=c&&c<=1&&r.points.push(n.lerp(i,c)))}return r},x.intersectCirclePolygon=function(t,e,n){return this.intersectCirclePolyline(t,e,p(n))},x.intersectCirclePolyline=function(t,e,n){for(var i,r=new x("No Intersection"),s=n.length,o=0;o0?r.status="Intersection":r.status=i.status,r},x.intersectCircleRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),a=new o(s.x,r.y),y=new o(r.x,s.y),u=x.intersectCircleLine(t,e,r,a),c=x.intersectCircleLine(t,e,a,s),h=x.intersectCircleLine(t,e,s,y),l=x.intersectCircleLine(t,e,y,r),p=new x("No Intersection");return p.appendPoints(u.points),p.appendPoints(c.points),p.appendPoints(h.points),p.appendPoints(l.points),p.points.length>0?p.status="Intersection":p.status=u.status,p},x.intersectEllipseEllipse=function(t,e,n,i,r,s){for(var a=[n*n,0,e*e,-2*n*n*t.x,-2*e*e*t.y,n*n*t.x*t.x+e*e*t.y*t.y-e*e*n*n],y=[s*s,0,r*r,-2*s*s*i.x,-2*r*r*i.y,s*s*i.x*i.x+r*r*i.y*i.y-r*r*s*s],u=x.bezout(a,y).getRoots(),c=.001*(a[0]*a[0]+2*a[1]*a[1]+a[2]*a[2]),l=.001*(y[0]*y[0]+2*y[1]*y[1]+y[2]*y[2]),p=new x("No Intersection"),f=0;f0&&(p.status="Intersection"),p},x.intersectEllipseLine=function(t,e,n,i,r){var s,o=new a(i.x,i.y),y=a.fromPoints(i,r),u=new a(t.x,t.y),c=o.subtract(u),h=new a(y.x/(e*e),y.y/(n*n)),l=new a(c.x/(e*e),c.y/(n*n)),p=y.dot(h),f=y.dot(l),d=f*f-p*(t=c.dot(l)-1);if(d<0)s=new x("Outside");else if(d>0){var v=Math.sqrt(d),w=(-f-v)/p,m=(-f+v)/p;(w<0||11&&m>1?"Outside":"Inside"):(s=new x("Intersection"),0<=w&&w<=1&&s.appendPoint(i.lerp(r,w)),0<=m&&m<=1&&s.appendPoint(i.lerp(r,m)))}else{var g=-f/p;0<=g&&g<=1?(s=new x("Intersection")).appendPoint(i.lerp(r,g)):s=new x("Outside")}return s},x.intersectEllipsePolygon=function(t,e,n,i){return this.intersectEllipsePolyline(t,e,n,p(i))},x.intersectEllipsePolyline=function(t,e,n,i){for(var r=new x("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},x.intersectEllipseRectangle=function(t,e,n,i,r){var s=i.min(r),a=i.max(r),y=new o(a.x,s.y),u=new o(s.x,a.y),c=x.intersectEllipseLine(t,e,n,s,y),h=x.intersectEllipseLine(t,e,n,y,a),l=x.intersectEllipseLine(t,e,n,a,u),p=x.intersectEllipseLine(t,e,n,u,s),f=new x("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(p.points),f.points.length>0&&(f.status="Intersection"),f},x.intersectLineLine=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=s/y,c=a/y;0<=u&&u<=1&&0<=c&&c<=1?(r=new x("Intersection")).points.push(new o(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y))):r=new x("No Intersection")}else r=new x(0==s||0==a?"Coincident":"Parallel");return r},x.intersectLinePolygon=function(t,e,n){return this.intersectLinePolyline(t,e,p(n))},x.intersectLinePolyline=function(t,e,n){for(var i=new x("No Intersection"),r=n.length,s=0;s0&&(i.status="Intersection"),i},x.intersectLineRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),a=new o(s.x,r.y),y=new o(r.x,s.y),u=x.intersectLineLine(r,a,t,e),c=x.intersectLineLine(a,s,t,e),h=x.intersectLineLine(s,y,t,e),l=x.intersectLineLine(y,r,t,e),p=new x("No Intersection");return p.appendPoints(u.points),p.appendPoints(c.points),p.appendPoints(h.points),p.appendPoints(l.points),p.points.length>0&&(p.status="Intersection"),p},x.intersectPolygonPolygon=function(t,e){return this.intersectPolylinePolyline(p(t),p(e))},x.intersectPolygonPolyline=function(t,e){return this.intersectPolylinePolyline(p(t),e)},x.intersectPolygonRectangle=function(t,e,n){return this.intersectPolylineRectangle(p(t),e,n)},x.intersectPolylinePolyline=function(t,e){for(var n=new x("No Intersection"),i=t.length,r=0;r0&&(n.status="Intersection"),n},x.intersectPolylineRectangle=function(t,e,n){var i=e.min(n),r=e.max(n),s=new o(r.x,i.y),a=new o(i.x,r.y),y=x.intersectLinePolyline(i,s,t),u=x.intersectLinePolyline(s,r,t),c=x.intersectLinePolyline(r,a,t),h=x.intersectLinePolyline(a,i,t),l=new x("No Intersection");return l.appendPoints(y.points),l.appendPoints(u.points),l.appendPoints(c.points),l.appendPoints(h.points),l.points.length>0&&(l.status="Intersection"),l},x.intersectRectangleRectangle=function(t,e,n,i){var r=t.min(e),s=t.max(e),a=new o(s.x,r.y),y=new o(r.x,s.y),u=x.intersectLineRectangle(r,a,n,i),c=x.intersectLineRectangle(a,s,n,i),h=x.intersectLineRectangle(s,y,n,i),l=x.intersectLineRectangle(y,r,n,i),p=new x("No Intersection");return p.appendPoints(u.points),p.appendPoints(c.points),p.appendPoints(h.points),p.appendPoints(l.points),p.points.length>0&&(p.status="Intersection"),p},x.intersectRayRay=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=s/y;(r=new x("Intersection")).points.push(new o(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y)))}else r=new x(0==s||0==a?"Coincident":"Parallel");return r},x.bezout=function(t,e){var n=t[0]*e[1]-e[0]*t[1],i=t[0]*e[2]-e[0]*t[2],r=t[0]*e[3]-e[0]*t[3],s=t[0]*e[4]-e[0]*t[4],o=t[0]*e[5]-e[0]*t[5],a=t[1]*e[2]-e[1]*t[2],y=t[1]*e[4]-e[1]*t[4],u=t[1]*e[5]-e[1]*t[5],c=t[2]*e[3]-e[2]*t[3],l=t[3]*e[4]-e[3]*t[4],p=t[3]*e[5]-e[3]*t[5],x=u+l,f=y-c;return new h(n*a-i*i,n*f+r*a-2*i*s,n*x+r*f-s*s-2*i*o,n*p+r*x-2*s*o,r*p-o*o)},f.prototype.init=function(t,e){this.name=t,this.args=e};var d={quadraticBezier:function(t,e,n,i,r,s){return new f("Bezier2",[new o(t,e),new o(n,i),new o(r,s)])},cubicBezier:function(t,e,n,i,r,s,a,y){return new f("Bezier3",[new o(t,e),new o(n,i),new o(r,s),new o(a,y)])},circle:function(t,e,n){return new f("Circle",[new o(t,e),n])},ellipse:function(t,e,n,i){return new f("Ellipse",[new o(t,e),n,i])},line:function(t,e,n,i){return new f("Line",[new o(t,e),new o(n,i)])},path:function(t){return new f("Path",t)},polygon:function(t){for(var e=[],n=0;n\n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n * @class\n * @param {string} status\n */\nfunction Intersection(status) {\n this.init(status);\n}\n\n\n/**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\nIntersection.prototype.init = function(status) {\n this.status = status;\n this.points = [];\n};\n\n\n/**\n * appendPoint\n *\n * @param {Point2D} point\n */\nIntersection.prototype.appendPoint = function(point) {\n this.points.push(point);\n};\n\n\n/**\n * appendPoints\n *\n * @param {Array} points\n */\nIntersection.prototype.appendPoints = function(points) {\n this.points = this.points.concat(points);\n};\n\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\nfunction IntersectionArgs(name, args) {\n this.init(name, args);\n}\n\n/**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\nIntersectionArgs.prototype.init = function(name, args) {\n this.name = name;\n this.args = args;\n};\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","IntersectionArgs","name","args","appendPoint","point","appendPoints","intersect","shape1","shape2","intersectPathShape","method","apply","path","shape","segment","inter","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file diff --git a/examples/PathHandler.js b/examples/PathHandler.js index 95c0719..05468ab 100644 --- a/examples/PathHandler.js +++ b/examples/PathHandler.js @@ -4,12 +4,7 @@ * @copyright 2017 Kevin Lindsey */ -"use strict"; - -let Shapes; -if (typeof module !== "undefined") { - ({Shapes} = require("../index")); -} +import {Shapes} from "../index.js"; /** * PathHandler @@ -436,6 +431,4 @@ PathHandler.prototype.closePath = function() { this.lastCommand = "z"; }; -if (typeof module !== "undefined") { - module.exports = PathHandler; -} +export default PathHandler; diff --git a/examples/example-1.js b/examples/example-1.js index 20c34a2..386ac63 100755 --- a/examples/example-1.js +++ b/examples/example-1.js @@ -1,8 +1,4 @@ -"use strict"; - -const lib = require("../index"); - -const {Point2D, Intersection} = lib; +import {Point2D, Intersection} from "../index.js"; const circle = { center: new Point2D(0, 0), diff --git a/examples/example-2.js b/examples/example-2.js index fa7b346..d52ea8e 100755 --- a/examples/example-2.js +++ b/examples/example-2.js @@ -1,8 +1,4 @@ -"use strict"; - -const lib = require("../index"); - -const {Intersection, Shapes} = lib; +import {Intersection, Shapes} from "../index.js"; const circle = Shapes.circle(0, 0, 50); const rectangle = Shapes.rectangle(0, 0, 60, 30); diff --git a/examples/example-3.js b/examples/example-3.js index a1a6bc9..734f784 100755 --- a/examples/example-3.js +++ b/examples/example-3.js @@ -1,6 +1,4 @@ -"use strict"; - -const {Point2D, Vector2D, Intersection, AffineShapes} = require("../index"); +import {Point2D, Vector2D, Intersection, AffineShapes} from "../index.js"; const circle = AffineShapes.circle(new Point2D(0, 0), 50); const rectangle = AffineShapes.rectangle(new Point2D(0, 0), new Vector2D(60, 30)); diff --git a/examples/path-line.js b/examples/path-line.js index 7ac819b..82a225a 100755 --- a/examples/path-line.js +++ b/examples/path-line.js @@ -1,10 +1,7 @@ -"use strict"; +import {PathParser} from "kld-path-parser"; -const {PathParser} = require("kld-path-parser"); -const lib = require("../index"), - PathHandler = require("./PathHandler"); - -const {Intersection, Shapes} = lib; +import PathHandler from "./PathHandler.js"; +import {Intersection, Shapes} from "../index.js"; // parser path data const pathData = "M0,0 C100,0 100,100 0,100z m20,0 c100,0 100,100 0,100z"; diff --git a/examples/rotate-rectangle-line.js b/examples/rotate-rectangle-line.js index 937395d..8a3a49d 100755 --- a/examples/rotate-rectangle-line.js +++ b/examples/rotate-rectangle-line.js @@ -1,6 +1,4 @@ -"use strict"; - -const {Intersection, Point2D, Matrix2D} = require("../index"); +import {Intersection, Point2D, Matrix2D} from "../index.js"; // define line const line = { diff --git a/examples/rotated-ellipse-line.js b/examples/rotated-ellipse-line.js index f45cce0..b3ec70c 100755 --- a/examples/rotated-ellipse-line.js +++ b/examples/rotated-ellipse-line.js @@ -1,8 +1,4 @@ -"use strict"; - -const lib = require("../index"); - -const {Intersection, Point2D, Matrix2D} = lib; +import {Intersection, Point2D, Matrix2D} from "../index.js"; // define line const line = { diff --git a/examples/tessellate-cubic-beziers.js b/examples/tessellate-cubic-beziers.js index f68c6f0..51b0a83 100755 --- a/examples/tessellate-cubic-beziers.js +++ b/examples/tessellate-cubic-beziers.js @@ -1,8 +1,6 @@ -"use strict"; +import {CubicBezier2D} from "kld-contours"; -const {CubicBezier2D} = require("kld-contours"); - -const {Intersection, Point2D} = require("../index"); +import {Intersection, Point2D} from "../index.js"; // create beziers const b1 = new CubicBezier2D( diff --git a/index.js b/index.js index 38bc3b5..8e7bf4e 100644 --- a/index.js +++ b/index.js @@ -1,13 +1,9 @@ -"use strict"; - // expose module classes -exports.Intersection = require("./lib/Intersection"); -exports.IntersectionArgs = require("./lib/IntersectionArgs"); -exports.Shapes = require("./lib/Shapes"); -exports.AffineShapes = require("./lib/AffineShapes"); -exports.IntersectionQuery = require("./lib/IntersectionQuery"); +export {default as Intersection} from "./lib/Intersection.js"; +export {default as IntersectionArgs} from "./lib/IntersectionArgs.js"; +export {default as Shapes} from "./lib/Shapes.js"; +export {default as AffineShapes} from "./lib/AffineShapes.js"; +export {default as IntersectionQuery} from "./lib/IntersectionQuery.js"; // expose affine module classes -exports.Point2D = require("kld-affine").Point2D; -exports.Vector2D = require("kld-affine").Vector2D; -exports.Matrix2D = require("kld-affine").Matrix2D; +export {Point2D, Vector2D, Matrix2D} from "kld-affine"; diff --git a/lib/AffineShapes.js b/lib/AffineShapes.js index ff846a1..b6cb8e9 100644 --- a/lib/AffineShapes.js +++ b/lib/AffineShapes.js @@ -3,17 +3,11 @@ * * @copyright 2017, Kevin Lindsey */ -"use strict"; - -let IntersectionArgs; -if (typeof module !== "undefined") { - IntersectionArgs = require("./IntersectionArgs"); -} +import IntersectionArgs from "./IntersectionArgs.js"; const AffineShapes = {}; - /** * quadraticBezier * @@ -123,6 +117,4 @@ AffineShapes.rectangle = function(topLeft, size) { }; -if (typeof module !== "undefined") { - module.exports = AffineShapes; -} +export default AffineShapes; diff --git a/lib/Intersection.js b/lib/Intersection.js index 000c078..e5c259c 100644 --- a/lib/Intersection.js +++ b/lib/Intersection.js @@ -7,7 +7,8 @@ * */ -"use strict"; +import {Point2D, Vector2D} from "kld-affine"; +import {Polynomial} from "kld-polynomial"; /** * @@ -18,12 +19,6 @@ function isNullish(o) { return o === null || o === undefined; } -let Point2D, Vector2D, Polynomial; -if (typeof module !== "undefined") { - ({Point2D, Vector2D} = require("kld-affine")); - ({Polynomial} = require("kld-polynomial")); -} - /** * closePolygon * @@ -1769,6 +1764,4 @@ Intersection.bezout = function(e1, e2) { ); }; -if (typeof module !== "undefined") { - module.exports = Intersection; -} +export default Intersection; diff --git a/lib/IntersectionArgs.js b/lib/IntersectionArgs.js index 7c98800..93d713b 100644 --- a/lib/IntersectionArgs.js +++ b/lib/IntersectionArgs.js @@ -6,8 +6,6 @@ * */ -"use strict"; - /** * IntersectionArgs * @@ -30,6 +28,4 @@ IntersectionArgs.prototype.init = function(name, args) { this.args = args; }; -if (typeof module !== "undefined") { - module.exports = IntersectionArgs; -} +export default IntersectionArgs; diff --git a/lib/IntersectionQuery.js b/lib/IntersectionQuery.js index ace331a..fef841c 100644 --- a/lib/IntersectionQuery.js +++ b/lib/IntersectionQuery.js @@ -6,12 +6,7 @@ * */ -"use strict"; - -let Vector2D; -if (typeof module !== "undefined") { - ({Vector2D} = require("kld-affine")); -} +import {Vector2D} from "kld-affine"; /** * @@ -109,6 +104,4 @@ IntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) { }; -if (typeof module !== "undefined") { - module.exports = IntersectionQuery; -} +export default IntersectionQuery; diff --git a/lib/Shapes.js b/lib/Shapes.js index ece5bc0..d81f92d 100644 --- a/lib/Shapes.js +++ b/lib/Shapes.js @@ -4,18 +4,12 @@ * @copyright 2017, Kevin Lindsey */ -"use strict"; - -let Point2D, IntersectionArgs; -if (typeof module !== "undefined") { - ({Point2D} = require("kld-affine")); - IntersectionArgs = require("./IntersectionArgs"); -} +import {Point2D} from "kld-affine"; +import IntersectionArgs from "./IntersectionArgs.js"; const Shapes = {}; - /** * quadraticBezier * @@ -172,6 +166,4 @@ Shapes.rectangle = function(x, y, width, height) { }; -if (typeof module !== "undefined") { - module.exports = Shapes; -} +export default Shapes; diff --git a/package-lock.json b/package-lock.json index d9c4156..6a0dd71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,255 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/core": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.4.tgz", + "integrity": "sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", + "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", + "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", + "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", + "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", + "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "dev": true, + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, "@babel/highlight": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", @@ -30,6 +279,469 @@ "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", "dev": true }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", + "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", + "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", + "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.11" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", + "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", + "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", + "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz", + "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz", + "integrity": "sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz", + "integrity": "sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.4" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/preset-env": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.4.tgz", + "integrity": "sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.4.4", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-classes": "^7.4.4", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.4.4", + "@babel/plugin-transform-modules-systemjs": "^7.4.4", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.4", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.4", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "browserslist": "^4.5.2", + "core-js-compat": "^3.0.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/register": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.4.4.tgz", + "integrity": "sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA==", + "dev": true, + "requires": { + "core-js": "^3.0.0", + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.11", + "mkdirp": "^0.5.1", + "pirates": "^4.0.0", + "source-map-support": "^0.5.9" + } + }, "@babel/runtime": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", @@ -39,6 +751,56 @@ "regenerator-runtime": "^0.13.2" } }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, "@mysticatea/eslint-plugin": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/@mysticatea/eslint-plugin/-/eslint-plugin-10.0.3.tgz", @@ -72,6 +834,27 @@ } } }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/node": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", + "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.7.0.tgz", @@ -175,6 +958,24 @@ "sprintf-js": "~1.0.2" } }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -191,12 +992,24 @@ "es-abstract": "^1.7.0" } }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "ast-metadata-inferer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.1.1.tgz", @@ -209,6 +1022,12 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "bail": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", @@ -221,6 +1040,61 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "bluebird": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", @@ -237,6 +1111,35 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -249,9 +1152,38 @@ "integrity": "sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000963", - "electron-to-chromium": "^1.3.127", - "node-releases": "^1.1.17" + "caniuse-lite": "^1.0.30000963", + "electron-to-chromium": "^1.3.127", + "node-releases": "^1.1.17" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "callsites": { @@ -352,6 +1284,29 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", @@ -399,6 +1354,16 @@ "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -420,12 +1385,30 @@ "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, "comment-parser": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.5.4.tgz", "integrity": "sha512-0h7W6Y1Kb6zKQMJqdX41C5qf9ITCVIsD2qP2RaqDF3GFkXFrmuAuv5zUOuo19YzyC9scjBNpqzuaRQ2Sy5pxMQ==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -438,6 +1421,59 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", + "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==", + "dev": true + }, + "core-js-compat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz", + "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==", + "dev": true, + "requires": { + "browserslist": "^4.5.4", + "core-js": "3.0.1", + "core-js-pure": "3.0.1", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz", + "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -493,6 +1529,12 @@ } } }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -508,6 +1550,47 @@ "object-keys": "^1.0.12" } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -1092,6 +2175,12 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, + "estree-walker": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", + "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", + "dev": true + }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -1113,12 +2202,83 @@ "strip-eof": "^1.0.0" } }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "external-editor": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", @@ -1130,6 +2290,71 @@ "tmp": "^0.0.33" } }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -1178,6 +2403,67 @@ "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", "dev": true }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -1213,6 +2499,21 @@ "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", "dev": true }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1258,6 +2559,12 @@ "pump": "^3.0.0" } }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -1311,6 +2618,44 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1420,12 +2765,47 @@ } } }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-alphabetical": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", @@ -1460,6 +2840,32 @@ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", @@ -1472,6 +2878,31 @@ "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", "dev": true }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -1503,6 +2934,38 @@ "js-types": "^1.0.0" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-obj-prop": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-1.0.0.tgz", @@ -1519,6 +2982,15 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -1565,6 +3037,12 @@ "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-word-character": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", @@ -1589,6 +3067,39 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1662,6 +3173,12 @@ "integrity": "sha512-JNbkKpDFqbYjg+IU3FNo7qjX7Opy7CwjHywT32zgAcz/d4lX6Umn5jOHVETUdnNNgGrMk0nEx1gvP0F4M0hzlQ==", "dev": true }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -1680,6 +3197,29 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, "klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", @@ -1834,6 +3374,15 @@ "chalk": "^2.0.1" } }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -1850,6 +3399,15 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, + "magic-string": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", + "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -1868,12 +3426,27 @@ "p-defer": "^1.0.0" } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, "markdown-escapes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", @@ -1965,6 +3538,36 @@ } } }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -2002,6 +3605,27 @@ "is-plain-obj": "^1.1.0" } }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -2054,6 +3678,25 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2076,6 +3719,12 @@ "semver": "^5.7.0" } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "node-releases": { "version": "1.1.17", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.17.tgz", @@ -2135,12 +3784,58 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -2163,6 +3858,15 @@ "es-abstract": "^1.5.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2335,6 +4039,12 @@ "json-parse-better-errors": "^1.0.1" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -2380,6 +4090,15 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -2434,6 +4153,12 @@ } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -2455,6 +4180,18 @@ "fast-diff": "^1.1.2" } }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -2555,6 +4292,21 @@ } } }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", @@ -2565,12 +4317,57 @@ "strip-indent": "^2.0.0" } }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", + "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", "dev": true }, + "regenerator-transform": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", + "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, "regexp-tree": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.6.tgz", @@ -2583,6 +4380,43 @@ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, "remark-parse": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", @@ -2606,6 +4440,12 @@ "xtend": "^4.0.1" } }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -2651,38 +4491,125 @@ "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", "dev": true }, - "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "resolve": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.11.2.tgz", + "integrity": "sha512-H5sS7GZ/Rn0t119Et8mw0QXtg5HTOI/1FL57EKHk5oduRmGaraOf3KcEt6j+dXJ9tXxWQkG+/FBjPS4dzxo6EA==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "^11.13.9", + "acorn": "^6.1.1" + }, + "dependencies": { + "@types/node": { + "version": "11.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.10.tgz", + "integrity": "sha512-leUNzbFTMX94TWaIKz8N15Chu55F9QSH+INKayQr5xpkasBQBRF3qQXfo3/dOnMU/dEIit+Y/SU8HyOjq++GwA==", + "dev": true + } + } + }, + "rollup-plugin-babel": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.3.2.tgz", + "integrity": "sha512-KfnizE258L/4enADKX61ozfwGHoqYauvoofghFJBhFnpH9Sb9dNPpWg8QHOaAfVASUYV8w0mCx430i9z0LJoJg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.3.0" + } + }, + "rollup-plugin-commonjs": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", + "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "estree-walker": "^0.6.0", + "magic-string": "^0.25.2", + "resolve": "^1.10.0", + "rollup-pluginutils": "^2.6.0" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "rollup-plugin-node-resolve": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.3.tgz", + "integrity": "sha512-r+WaesPzdGEynpLZLALFEDugA4ACa5zn7bc/+LVX4vAXQQ8IgDHv0xfsSvJ8tDXUtprfBtrDtRFg27ifKjcJTg==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.10.0" + } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "rollup-plugin-terser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-4.0.4.tgz", + "integrity": "sha512-wPANT5XKVJJ8RDUN0+wIr7UPd0lIXBo4UdJ59VmlPCtlFsE20AM+14pe+tk7YunCsWEiuzkDBY3QIkSCjtrPXg==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "@babel/code-frame": "^7.0.0", + "jest-worker": "^24.0.0", + "serialize-javascript": "^1.6.1", + "terser": "^3.14.1" } }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "rollup-pluginutils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", + "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "estree-walker": "^0.6.0", + "micromatch": "^3.1.10" } }, "run-async": { @@ -2703,6 +4630,12 @@ "tslib": "^1.9.0" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "safe-regex": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.0.2.tgz", @@ -2724,12 +4657,41 @@ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -2762,6 +4724,183 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "dev": true + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -2794,6 +4933,15 @@ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2806,6 +4954,27 @@ "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", "dev": true }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -2816,6 +4985,15 @@ "strip-ansi": "^4.0.0" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -2924,6 +5102,25 @@ "uuid": "^3.0.1" } }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2945,6 +5142,71 @@ "os-tmpdir": "~1.0.2" } }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -2957,6 +5219,12 @@ "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, "trim-trailing-lines": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", @@ -3021,6 +5289,34 @@ "xtend": "^4.0.1" } }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, "unified": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", @@ -3035,6 +5331,41 @@ "x-is-string": "^0.1.0" } }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, "unist-util-is": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", @@ -3074,6 +5405,46 @@ "unist-util-is": "^2.1.2" } }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -3083,6 +5454,24 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", diff --git a/package.json b/package.json index 0dc6b36..b326d45 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,15 @@ "type": "git", "url": "git://github.com/thelonious/kld-intersections.git" }, - "main": "index.js", + "main": "dist/index-umd.js", + "module": "index.js", + "browserslist": [ + "cover 100%" + ], "scripts": { "eslint": "eslint .", - "test": "npm run eslint && mocha", + "rollup": "rollup -c", + "test": "npm run eslint && npm run rollup && mocha --require @babel/register", "start": "static -p 8055", "build-docs": "rm -rf docs/jsdoc/*;jsdoc --pedantic -c docs/jsdoc-config.js .", "open-docs": "opn http://localhost:8055/docs/jsdoc/ && npm start" @@ -43,6 +48,10 @@ "kld-polynomial": "^0.1.3" }, "devDependencies": { + "@babel/core": "^7.4.4", + "@babel/plugin-transform-modules-commonjs": "^7.4.4", + "@babel/preset-env": "^7.4.4", + "@babel/register": "^7.4.4", "@mysticatea/eslint-plugin": "^10.0.3", "eslint": "^5.16.0", "eslint-config-ash-nazg": "^4.0.0", @@ -63,6 +72,11 @@ "mocha": "^6.1.4", "node-static": "^0.7.11", "opn-cli": "^4.1.0", + "rollup": "^1.11.2", + "rollup-plugin-babel": "^4.3.2", + "rollup-plugin-commonjs": "^9.3.4", + "rollup-plugin-node-resolve": "^4.2.3", + "rollup-plugin-terser": "^4.0.4", "typescript": "^3.4.5" }, "engines": { diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..8e8f0f5 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,50 @@ +import resolve from "rollup-plugin-node-resolve"; +import commonjs from "rollup-plugin-commonjs"; +import babel from "rollup-plugin-babel"; +import {terser} from "rollup-plugin-terser"; + +/** + * @external RollupConfig + * @type {PlainObject} + * @see {@link https://rollupjs.org/guide/en#big-list-of-options} + */ + +/** + * @param {PlainObject} config + * @param {boolean} config.minifying + * @param {string} [config.format="umd"} = {}] + * @returns {external:RollupConfig} + */ +function getRollupObject({minifying, format = "umd"} = {}) { + const nonMinified = { + input: "index.js", + output: { + format, + sourcemap: minifying, + file: `dist/index-${format}${minifying ? ".min" : ""}.js`, + name: "KldIntersections" + }, + plugins: [ + babel({ + babelrc: false, + presets: [ + ["@babel/env", {modules: false}] + ] + }), + resolve(), + commonjs() + ] + }; + if (minifying) { + nonMinified.plugins.push(terser()); + } + return nonMinified; +} + +// eslint-disable-next-line import/no-anonymous-default-export +export default [ + getRollupObject({minifying: true, format: "umd"}), + getRollupObject({minifying: false, format: "umd"}), + getRollupObject({minifying: true, format: "esm"}), + getRollupObject({minifying: false, format: "esm"}) +]; diff --git a/test/cubic-cubic-fail.js b/test/cubic-cubic-fail.js index df7175d..2c4eefc 100755 --- a/test/cubic-cubic-fail.js +++ b/test/cubic-cubic-fail.js @@ -1,9 +1,7 @@ -"use strict"; +import {PathParser} from "kld-path-parser"; +import PathHandler from "../examples/PathHandler.js"; -const {PathParser} = require("kld-path-parser"); -const PathHandler = require("../examples/PathHandler"); - -const {Intersection, Shapes} = require("../index"); +import {Intersection, Shapes} from "../index.js"; // parser path data const pathData1 = "M150,150 C183.33333333333331,216.66666666666663 233.33333333333337,216.66666666666663 300,150"; diff --git a/test/find_parameters.js b/test/find_parameters.js index 9596c55..d0c71e3 100755 --- a/test/find_parameters.js +++ b/test/find_parameters.js @@ -1,7 +1,5 @@ -"use strict"; - -const {CubicBezier2D} = require("kld-contours"); -const {Point2D, Intersection, IntersectionArgs} = require("../index"); +import {CubicBezier2D} from "kld-contours"; +import {Point2D, Intersection, IntersectionArgs} from "../index.js"; /** * diff --git a/test/intersection_tests.js b/test/intersection_tests.js index 1d72a5d..6d18225 100644 --- a/test/intersection_tests.js +++ b/test/intersection_tests.js @@ -1,8 +1,6 @@ -"use strict"; +import assert from "assert"; -const assert = require("assert"); - -const {Intersection, Point2D} = require("../index"); +import {Intersection, Point2D} from "../index.js"; describe("Intersections", () => { describe("Line-Line Intersection", () => { From d7dce27f95670a615ed825ce62672a0574af6fe6 Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Sun, 5 May 2019 10:13:23 +0800 Subject: [PATCH 2/3] - Refactoring: Use ES6 classes --- dist/index-esm.js | 152 +- dist/index-esm.min.js | 2 +- dist/index-esm.min.js.map | 2 +- dist/index-umd.js | 8264 +++++++++++++++++++------------------ dist/index-umd.min.js | 2 +- dist/index-umd.min.js.map | 2 +- examples/PathHandler.js | 783 ++-- lib/Intersection.js | 66 +- lib/IntersectionArgs.js | 35 +- 9 files changed, 4704 insertions(+), 4604 deletions(-) diff --git a/dist/index-esm.js b/dist/index-esm.js index 90f86f1..74ba50f 100644 --- a/dist/index-esm.js +++ b/dist/index-esm.js @@ -1,3 +1,25 @@ +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } @@ -1998,7 +2020,6 @@ SqrtPolynomial.prototype.toString = function () { // expose classes var Polynomial = Polynomial_1; -/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */ /** * * @param {*} o @@ -2023,46 +2044,60 @@ function closePolygon(points) { } /** * Intersection - * @class - * @param {string} status */ -function Intersection(status) { - this.init(status); -} -/** - * init - * - * @param {string} status - * @returns {Intersection} - */ - - -Intersection.prototype.init = function (status) { - this.status = status; - this.points = []; -}; -/** - * appendPoint - * - * @param {Point2D} point - */ - - -Intersection.prototype.appendPoint = function (point) { - this.points.push(point); -}; -/** - * appendPoints - * - * @param {Array} points - */ +var Intersection = +/*#__PURE__*/ +function () { + /** + * @param {string} status + */ + function Intersection(status) { + _classCallCheck(this, Intersection); + this.init(status); + } + /** + * init + * + * @param {string} status + * @returns {Intersection} + */ + + + _createClass(Intersection, [{ + key: "init", + value: function init(status) { + this.status = status; + this.points = []; + } + /** + * appendPoint + * + * @param {Point2D} point + */ + + }, { + key: "appendPoint", + value: function appendPoint(point) { + this.points.push(point); + } + /** + * appendPoints + * + * @param {Array} points + */ + + }, { + key: "appendPoints", + value: function appendPoints(points) { + this.points = this.points.concat(points); + } + }]); -Intersection.prototype.appendPoints = function (points) { - this.points = this.points.concat(points); -}; // static methods + return Intersection; +}(); // static methods /** * intersect @@ -3723,25 +3758,38 @@ Intersection.bezout = function (e1, e2) { /** * IntersectionArgs * - * @param {string} name - * @param {Array} args - * @returns {IntersectionArgs} - */ -function IntersectionArgs(name, args) { - this.init(name, args); -} -/** - * init - * - * @param {string} name - * @param {Array} args */ +var IntersectionArgs = +/*#__PURE__*/ +function () { + /** + * @param {string} name + * @param {Array} args + * @returns {IntersectionArgs} + */ + function IntersectionArgs(name, args) { + _classCallCheck(this, IntersectionArgs); + this.init(name, args); + } + /** + * init + * + * @param {string} name + * @param {Array} args + */ + + + _createClass(IntersectionArgs, [{ + key: "init", + value: function init(name, args) { + this.name = name; + this.args = args; + } + }]); -IntersectionArgs.prototype.init = function (name, args) { - this.name = name; - this.args = args; -}; + return IntersectionArgs; +}(); /** * Shapes diff --git a/dist/index-esm.min.js b/dist/index-esm.min.js index d47874a..4b4621c 100644 --- a/dist/index-esm.min.js +++ b/dist/index-esm.min.js @@ -1,2 +1,2 @@ -function t(t,e){return t(e={exports:{}},e.exports),e.exports}var e=t(function(t){function e(t,e){Object.defineProperties(this,{x:{value:void 0!==t?t:0,writable:!1,enumerable:!0,configurable:!1},y:{value:void 0!==e?e:0,writable:!1,enumerable:!0,configurable:!1}})}e.prototype.clone=function(){return new this.constructor(this.x,this.y)},e.prototype.add=function(t){return new this.constructor(this.x+t.x,this.y+t.y)},e.prototype.subtract=function(t){return new this.constructor(this.x-t.x,this.y-t.y)},e.prototype.multiply=function(t){return new this.constructor(this.x*t,this.y*t)},e.prototype.divide=function(t){return new this.constructor(this.x/t,this.y/t)},e.prototype.equals=function(t){return this.x===t.x&&this.y===t.y},e.prototype.precisionEquals=function(t,e){return Math.abs(this.x-t.x)=0;e--)this.coefs.push(t[e]);this._variable="t",this._s=0},e.prototype.eval=function(t){if(isNaN(t))throw new Error("Polynomial.eval: parameter must be a number");for(var e=0,n=this.coefs.length-1;n>=0;n--)e=e*t+this.coefs[n];return e},e.prototype.add=function(t){for(var n=new e,i=this.getDegree(),r=t.getDegree(),s=Math.max(i,r),o=0;o<=s;o++){var a=o<=i?this.coefs[o]:0,y=o<=r?t.coefs[o]:0;n.coefs[o]=a+y}return n},e.prototype.multiply=function(t){for(var n=new e,i=0;i<=this.getDegree()+t.getDegree();i++)n.coefs.push(0);for(i=0;i<=this.getDegree();i++)for(var r=0;r<=t.getDegree();r++)n.coefs[i+r]+=this.coefs[i]*t.coefs[r];return n},e.prototype.divide_scalar=function(t){for(var e=0;e=0&&Math.abs(this.coefs[e])<=t;e--)this.coefs.pop()},e.prototype.bisection=function(t,n){var i,r=this.eval(t),s=this.eval(n);if(Math.abs(r)<=e.TOLERANCE)i=t;else if(Math.abs(s)<=e.TOLERANCE)i=n;else if(r*s<=0)for(var o=Math.log(n-t),a=Math.LN10*e.ACCURACY,y=Math.ceil((o+a)/Math.LN2),u=0;u=0;n--){var i=Math.round(1e3*this.coefs[n])/1e3;if(0!=i){var r=i<0?" - ":" + ";i=Math.abs(i),n>0&&(1==i?i=this._variable:i+=this._variable),n>1&&(i+="^"+n),e.push(r),t.push(i)}}e[0]=" + "==e[0]?"":"-";var s="";for(n=0;n=3&&(s=e.interpolate(r,i,3,o-3,0),Math.abs(s.dy)<=1e-6*s.y)));o++)i[o]=i[o-1],r[o]=.25*r[o-1];return s.y},e.prototype.getDegree=function(){return this.coefs.length-1},e.prototype.getDerivative=function(){for(var t=new e,n=1;n0){for(null!=(n=this.bisection(t,s[0]))&&r.push(n),i=0;i<=s.length-2;i++)null!=(n=this.bisection(s[i],s[i+1]))&&r.push(n);null!=(n=this.bisection(s[s.length-1],e))&&r.push(n)}else null!=(n=this.bisection(t,e))&&r.push(n)}return r},e.prototype.getLinearRoot=function(){var t=[],e=this.coefs[1];return 0!=e&&t.push(-this.coefs[0]/e),t},e.prototype.getQuadraticRoots=function(){var t=[];if(2==this.getDegree()){var e=this.coefs[2],n=this.coefs[1]/e,i=n*n-4*(this.coefs[0]/e);if(i>0){var r=Math.sqrt(i);t.push(.5*(-n+r)),t.push(.5*(-n-r))}else 0==i&&t.push(.5*-n)}return t},e.prototype.getCubicRoots=function(){var t=[];if(3==this.getDegree()){var e=this.coefs[3],n=this.coefs[2]/e,i=this.coefs[1]/e,r=(3*i-n*n)/3,s=(2*n*n*n-9*i*n+27*(this.coefs[0]/e))/27,o=n/3,a=s*s/4+r*r*r/27,y=s/2,u=this.zeroErrorEstimate();if(Math.abs(a)<=u&&(a=0),a>0){var c,h=Math.sqrt(a);c=(v=-y+h)>=0?Math.pow(v,1/3):-Math.pow(-v,1/3),(v=-y-h)>=0?c+=Math.pow(v,1/3):c-=Math.pow(-v,1/3),t.push(c-o)}else if(a<0){var l=Math.sqrt(-r/3),p=Math.atan2(Math.sqrt(-a),-y)/3,x=Math.cos(p),f=Math.sin(p),d=Math.sqrt(3);t.push(2*l*x-o),t.push(-l*(x+d*f)-o),t.push(-l*(x-d*f)-o)}else{var v;v=y>=0?-Math.pow(y,1/3):Math.pow(-y,1/3),t.push(2*v-o),t.push(-v-o)}}return t};var n=function(t){return"number"==typeof t?t?t<0?-1:1:t==t?t:NaN:NaN};e.prototype.getQuarticRoots=function(){var t=[],i=this.getDegree();if(4==i){var r=new e;r.coefs=this.coefs.slice(),r.divide_scalar(r.coefs[i]);Math.abs(r.coefs[0])<10*1e-15*Math.abs(r.coefs[3])&&(r.coefs[0]=0);var s,o=r.getDerivative(),a=o.getRoots().sort(function(t,e){return t-e}),y=[],u=a.length-1,c=this.bounds();maxabsX=Math.max(Math.abs(c.minX),Math.abs(c.maxX));var h=this.zeroErrorEstimate(maxabsX);for(s=0;s<=u;s++)y.push(r.eval(a[s]));for(s=0;s<=u;s++)Math.abs(y[s])-1){for(0!=y[0]?n(y[0])!=n(r.eval(a[0]-l)-y[0])&&(p.push(a[0]-l),x.push([c.minX,a[0]])):(t.push(a[0],a[0]),s++);s0)for(s=0;se?s:e},0)},e.prototype.bounds_UpperReal_Fujiwara=function(){var t=this.coefs,e=t.length-1,n=t[e];1!=n&&(t=this.coefs.map(function(t){return t/n}));var i,r=t.map(function(t,n){return n0)},{negX:-2*r.reduce(s,{max:0,nearmax:0}).max,posX:2*o.max}},e.prototype.bounds_LowerReal_Fujiwara=function(){var t=new e;t.coefs=this.coefs.slice().reverse();var n=t.bounds_UpperReal_Fujiwara();return n.negX=1/n.negX,n.posX=1/n.posX,n},e.prototype.bounds=function(){var t=this.bounds_UpperReal_Fujiwara(),e={minX:t.negX,maxX:t.posX};return 0===t.negX&&0===t.posX?e:(0===t.negX?e.minX=this.bounds_LowerReal_Fujiwara().posX:0===t.posX&&(e.maxX=this.bounds_LowerReal_Fujiwara().negX),e.minX>e.maxX&&(e.minX=e.maxX=0),e)},e.newton_secant_bisection=function(t,e,i,r,s,o){var a,u,c,h,l,p,x=0,f=0;a=t;var d=Math.pow(10,-14),v="number"==typeof s&&"number"==typeof o;if(v){if(s>o)throw new Error("newton root finding: min must be greater than max");if(l=e(s),p=e(o),n(l)==n(p))throw new Error("newton root finding: y values of bounds must be of opposite sign")}var w,m=function(){return Math.abs(c)<=d*Math.abs(a)||f==a-c-a};for(w=0;wo){if(n(l)==n(p))break;var g=p-l,b=o-s;if(c=0==g?a-(s+.5*b):Math.abs(g/Math.min(l,p))>50?a-(s+b*(.5+(Math.abs(l)0&&(n.status="Intersection"),n},p.intersectBezier2Bezier2=function(t,e,n,i,r,o){var a,y,u=new p("No Intersection");a=e.multiply(-2);var h=t.add(a.add(n));a=t.multiply(-2),y=e.multiply(2);var l=a.add(y),x=new s(t.x,t.y);a=r.multiply(-2);var f=i.add(a.add(o));a=i.multiply(-2),y=r.multiply(2);var d=a.add(y),v=new s(i.x,i.y);a=h.x*l.y-l.x*h.y,y=f.x*l.y-l.x*f.y;var w=d.x*l.y-l.x*d.y,m=l.x*(x.y-v.y)+l.y*(-x.x+v.x),g=f.x*h.y-h.x*f.y,b=d.x*h.y-h.x*d.y,P=h.x*(x.y-v.y)+h.y*(-x.x+v.x),M=new c(-g*g,-2*g*b,a*y-b*b-2*g*P,a*w-2*b*P,a*m-P*P).getRoots(),I=!0,N=!1,L=void 0;try{for(var R,E=M[Symbol.iterator]();!(I=(R=E.next()).done);I=!0){var z=R.value;if(0<=z&&z<=1){var B=new c(h.x,l.x,x.x-v.x-z*d.x-z*z*f.x);B.simplify();var X=B.getRoots(),C=new c(h.y,l.y,x.y-v.y-z*d.y-z*z*f.y);C.simplify();var _=C.getRoots();if(X.length>0&&_.length>0){var S=!0,q=!1,A=void 0;try{t:for(var D,k=X[Symbol.iterator]();!(S=(D=k.next()).done);S=!0){var O=D.value;if(0<=O&&O<=1)for(var T=0;T<_.length;T++)if(Math.abs(O-_[T])<1e-4){u.points.push(f.multiply(z*z).add(d.multiply(z).add(v)));break t}}}catch(t){q=!0,A=t}finally{try{S||null==k.return||k.return()}finally{if(q)throw A}}}}}}catch(t){N=!0,L=t}finally{try{I||null==E.return||E.return()}finally{if(N)throw L}}return u.points.length>0&&(u.status="Intersection"),u},p.intersectBezier2Bezier3=function(t,e,n,i,r,a,y){var u,h,l,x,f=new p("No Intersection");u=e.multiply(-2);var d=t.add(u.add(n));u=t.multiply(-2),h=e.multiply(2);var v=u.add(h),w=new s(t.x,t.y);u=i.multiply(-1),h=r.multiply(3),l=a.multiply(-3),x=u.add(h.add(l.add(y)));var m=new o(x.x,x.y);u=i.multiply(3),h=r.multiply(-6),l=a.multiply(3),x=u.add(h.add(l));var g=new o(x.x,x.y);u=i.multiply(-3),h=r.multiply(3),l=u.add(h);var b=new o(l.x,l.y),P=new o(i.x,i.y),M=w.x*w.x,I=w.y*w.y,N=v.x*v.x,L=v.y*v.y,R=d.x*d.x,E=d.y*d.y,z=P.x*P.x,B=P.y*P.y,X=b.x*b.x,C=b.y*b.y,_=g.x*g.x,S=g.y*g.y,q=m.x*m.x,A=m.y*m.y,D=new c(-2*d.x*d.y*m.x*m.y+R*A+E*q,-2*d.x*d.y*g.x*m.y-2*d.x*d.y*g.y*m.x+2*E*g.x*m.x+2*R*g.y*m.y,-2*d.x*b.x*d.y*m.y-2*d.x*d.y*b.y*m.x-2*d.x*d.y*g.x*g.y+2*b.x*E*m.x+E*_+R*(2*b.y*m.y+S),2*w.x*d.x*d.y*m.y+2*w.y*d.x*d.y*m.x+v.x*v.y*d.x*m.y+v.x*v.y*d.y*m.x-2*P.x*d.x*d.y*m.y-2*d.x*P.y*d.y*m.x-2*d.x*b.x*d.y*g.y-2*d.x*d.y*b.y*g.x-2*w.x*E*m.x-2*w.y*R*m.y+2*P.x*E*m.x+2*b.x*E*g.x-L*d.x*m.x-N*d.y*m.y+R*(2*P.y*m.y+2*b.y*g.y),2*w.x*d.x*d.y*g.y+2*w.y*d.x*d.y*g.x+v.x*v.y*d.x*g.y+v.x*v.y*d.y*g.x-2*P.x*d.x*d.y*g.y-2*d.x*P.y*d.y*g.x-2*d.x*b.x*d.y*b.y-2*w.x*E*g.x-2*w.y*R*g.y+2*P.x*E*g.x-L*d.x*g.x-N*d.y*g.y+X*E+R*(2*P.y*g.y+C),2*w.x*d.x*d.y*b.y+2*w.y*d.x*b.x*d.y+v.x*v.y*d.x*b.y+v.x*v.y*b.x*d.y-2*P.x*d.x*d.y*b.y-2*d.x*P.y*b.x*d.y-2*w.x*b.x*E-2*w.y*R*b.y+2*P.x*b.x*E-L*d.x*b.x-N*d.y*b.y+2*R*P.y*b.y,-2*w.x*w.y*d.x*d.y-w.x*v.x*v.y*d.y-w.y*v.x*v.y*d.x+2*w.x*d.x*P.y*d.y+2*w.y*P.x*d.x*d.y+v.x*P.x*v.y*d.y+v.x*v.y*d.x*P.y-2*P.x*d.x*P.y*d.y-2*w.x*P.x*E+w.x*L*d.x+w.y*N*d.y-2*w.y*R*P.y-P.x*L*d.x-N*P.y*d.y+M*E+I*R+z*E+R*B).getRootsInInterval(0,1),k=!0,O=!1,T=void 0;try{for(var j,F=D[Symbol.iterator]();!(k=(j=F.next()).done);k=!0){var U=j.value,Y=new c(d.x,v.x,w.x-P.x-U*b.x-U*U*g.x-U*U*U*m.x).getRoots(),Q=new c(d.y,v.y,w.y-P.y-U*b.y-U*U*g.y-U*U*U*m.y).getRoots();if(Y.length>0&&Q.length>0){var V=!0,G=!1,H=void 0;try{t:for(var J,K=Y[Symbol.iterator]();!(V=(J=K.next()).done);V=!0){var W=J.value;if(0<=W&&W<=1)for(var Z=0;Z0&&(f.status="Intersection"),f},p.intersectBezier2Circle=function(t,e,n,i,r){return p.intersectBezier2Ellipse(t,e,n,i,r,r)},p.intersectBezier2Ellipse=function(t,e,n,i,r,o){var a,y=new p("No Intersection");a=e.multiply(-2);var u=t.add(a.add(n));a=t.multiply(-2);var h=e.multiply(2),l=a.add(h),x=new s(t.x,t.y),f=r*r,d=o*o,v=new c(d*u.x*u.x+f*u.y*u.y,2*(d*u.x*l.x+f*u.y*l.y),d*(2*u.x*x.x+l.x*l.x)+f*(2*u.y*x.y+l.y*l.y)-2*(d*i.x*u.x+f*i.y*u.y),2*(d*l.x*(x.x-i.x)+f*l.y*(x.y-i.y)),d*(x.x*x.x+i.x*i.x)+f*(x.y*x.y+i.y*i.y)-2*(d*i.x*x.x+f*i.y*x.y)-f*d).getRoots(),w=!0,m=!1,g=void 0;try{for(var b,P=v[Symbol.iterator]();!(w=(b=P.next()).done);w=!0){var M=b.value;0<=M&&M<=1&&y.points.push(u.multiply(M*M).add(l.multiply(M).add(x)))}}catch(t){m=!0,g=t}finally{try{w||null==P.return||P.return()}finally{if(m)throw g}}return y.points.length>0&&(y.status="Intersection"),y},p.intersectBezier2Line=function(t,e,n,i,r){var a,y=i.min(r),u=i.max(r),h=new p("No Intersection");a=e.multiply(-2);var l=t.add(a.add(n));a=t.multiply(-2);var x=e.multiply(2),f=a.add(x),d=new s(t.x,t.y),v=new o(i.y-r.y,r.x-i.x),w=i.x*r.y-r.x*i.y,m=new c(v.dot(l),v.dot(f),v.dot(d)+w).getRoots(),g=!0,b=!1,P=void 0;try{for(var M,I=m[Symbol.iterator]();!(g=(M=I.next()).done);g=!0){var N=M.value;if(0<=N&&N<=1){var L=t.lerp(e,N),R=e.lerp(n,N),E=L.lerp(R,N);i.x==r.x?y.y<=E.y&&E.y<=u.y&&(h.status="Intersection",h.appendPoint(E)):i.y==r.y?y.x<=E.x&&E.x<=u.x&&(h.status="Intersection",h.appendPoint(E)):y.x<=E.x&&E.x<=u.x&&y.y<=E.y&&E.y<=u.y&&(h.status="Intersection",h.appendPoint(E))}}}catch(t){b=!0,P=t}finally{try{g||null==I.return||I.return()}finally{if(b)throw P}}return h},p.intersectBezier2Polygon=function(t,e,n,i){return p.intersectBezier2Polyline(t,e,n,l(i))},p.intersectBezier2Polyline=function(t,e,n,i){for(var r=new p("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},p.intersectBezier2Rectangle=function(t,e,n,i,r){var o=i.min(r),a=i.max(r),y=new s(a.x,o.y),u=new s(o.x,a.y),c=p.intersectBezier2Line(t,e,n,o,y),h=p.intersectBezier2Line(t,e,n,y,a),l=p.intersectBezier2Line(t,e,n,a,u),x=p.intersectBezier2Line(t,e,n,u,o),f=new p("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(x.points),f.points.length>0&&(f.status="Intersection"),f},p.intersectBezier3Bezier3=function(t,e,n,i,r,s,a,y){var u,h,l,x,f=new p("No Intersection");u=t.multiply(-1),h=e.multiply(3),l=n.multiply(-3),x=u.add(h.add(l.add(i)));var d=new o(x.x,x.y);u=t.multiply(3),h=e.multiply(-6),l=n.multiply(3),x=u.add(h.add(l));var v=new o(x.x,x.y);u=t.multiply(-3),h=e.multiply(3),l=u.add(h);var w=new o(l.x,l.y),m=new o(t.x,t.y);u=r.multiply(-1),h=s.multiply(3),l=a.multiply(-3),x=u.add(h.add(l.add(y)));var g=new o(x.x,x.y);u=r.multiply(3),h=s.multiply(-6),l=a.multiply(3),x=u.add(h.add(l));var b=new o(x.x,x.y);u=r.multiply(-3),h=s.multiply(3),l=u.add(h);var P=new o(l.x,l.y),M=new o(r.x,r.y);u=d.x*v.y-v.x*d.y,h=d.x*w.y-w.x*d.y;var I=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,N=P.x*d.y-d.x*P.y,L=b.x*d.y-d.x*b.y,R=g.x*d.y-d.x*g.y;x=d.x*w.y-w.x*d.y;var E=d.x*m.y+v.x*w.y-w.x*v.y-m.x*d.y+M.x*d.y-d.x*M.y,z=P.x*d.y-d.x*P.y,B=b.x*d.y-d.x*b.y,X=g.x*d.y-d.x*g.y,C=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,_=P.x*v.y-v.x*P.y,S=b.x*v.y-v.x*b.y,q=g.x*v.y-v.x*g.y,A=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,D=P.x*d.y-d.x*P.y,k=b.x*d.y-d.x*b.y,O=g.x*d.y-d.x*g.y,T=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,j=P.x*v.y-v.x*P.y,F=b.x*v.y-v.x*b.y,U=g.x*v.y-v.x*g.y,Y=w.x*m.y-m.x*w.y+M.x*w.y-w.x*M.y,Q=P.x*w.y-w.x*P.y,V=b.x*w.y-w.x*b.y,G=g.x*w.y-w.x*g.y,H=new c(-R*X*O,-R*X*k-R*B*O-L*X*O,-R*X*D-R*B*k-L*X*k-R*z*O-L*B*O-N*X*O,-R*X*A-R*B*D-L*X*D-R*z*k-L*B*k-N*X*k-R*E*O-L*z*O-N*B*O-I*X*O+h*q*O+R*x*U-u*q*U+u*X*G,-R*B*A-L*X*A-R*z*D-L*B*D-N*X*D-R*E*k-L*z*k-N*B*k-I*X*k+h*q*k-L*E*O-N*z*O-I*B*O+h*S*O+R*x*F-u*q*F+L*x*U-u*S*U+u*X*V+u*B*G,-R*z*A-L*B*A-N*X*A-R*E*D-L*z*D-N*B*D-I*X*D+h*q*D-L*E*k-N*z*k-I*B*k+h*S*k-N*E*O-I*z*O+h*_*O+R*x*j-u*q*j+L*x*F-u*S*F+N*x*U-u*_*U+u*X*Q+u*B*V+u*z*G,-R*E*A-L*z*A-N*B*A-I*X*A+h*q*A-L*E*D-N*z*D-I*B*D+h*S*D-N*E*k-I*z*k+h*_*k-I*E*O+h*C*O+R*x*T-u*q*T+L*x*j-u*S*j+N*x*F-u*_*F+I*x*U-u*C*U+u*X*Y+u*B*Q+u*z*V-h*x*G+u*E*G,-L*E*A-N*z*A-I*B*A+h*S*A-N*E*D-I*z*D+h*_*D-I*E*k+h*C*k+L*x*T-u*S*T+N*x*j-u*_*j+I*x*F-u*C*F+u*B*Y+u*z*Q-h*x*V+u*E*V,-N*E*A-I*z*A+h*_*A-I*E*D+h*C*D+N*x*T-u*_*T+I*x*j-u*C*j+u*z*Y-h*x*Q+u*E*Q,-I*E*A+h*C*A+I*x*T-u*C*T-h*x*Y+u*E*Y);H.simplify();var J=H.getRootsInInterval(0,1),K=!0,W=!1,Z=void 0;try{for(var $,tt=J[Symbol.iterator]();!(K=($=tt.next()).done);K=!0){var et=$.value,nt=new c(d.x,v.x,w.x,m.x-M.x-et*P.x-et*et*b.x-et*et*et*g.x);nt.simplify();var it=nt.getRoots(),rt=new c(d.y,v.y,w.y,m.y-M.y-et*P.y-et*et*b.y-et*et*et*g.y);rt.simplify();var st=rt.getRoots();if(it.length>0&&st.length>0){var ot=!0,at=!1,yt=void 0;try{t:for(var ut,ct=it[Symbol.iterator]();!(ot=(ut=ct.next()).done);ot=!0){var ht=ut.value;if(0<=ht&&ht<=1)for(var lt=0;lt0&&(f.status="Intersection"),f},p.intersectBezier3Circle=function(t,e,n,i,r,s){return p.intersectBezier3Ellipse(t,e,n,i,r,s,s)},p.intersectBezier3Ellipse=function(t,e,n,i,r,s,a){var y,u,h,l,x=new p("No Intersection");y=t.multiply(-1),u=e.multiply(3),h=n.multiply(-3),l=y.add(u.add(h.add(i)));var f=new o(l.x,l.y);y=t.multiply(3),u=e.multiply(-6),h=n.multiply(3),l=y.add(u.add(h));var d=new o(l.x,l.y);y=t.multiply(-3),u=e.multiply(3),h=y.add(u);var v=new o(h.x,h.y),w=new o(t.x,t.y),m=s*s,g=a*a,b=new c(f.x*f.x*g+f.y*f.y*m,2*(f.x*d.x*g+f.y*d.y*m),2*(f.x*v.x*g+f.y*v.y*m)+d.x*d.x*g+d.y*d.y*m,2*f.x*g*(w.x-r.x)+2*f.y*m*(w.y-r.y)+2*(d.x*v.x*g+d.y*v.y*m),2*d.x*g*(w.x-r.x)+2*d.y*m*(w.y-r.y)+v.x*v.x*g+v.y*v.y*m,2*v.x*g*(w.x-r.x)+2*v.y*m*(w.y-r.y),w.x*w.x*g-2*w.y*r.y*m-2*w.x*r.x*g+w.y*w.y*m+r.x*r.x*g+r.y*r.y*m-m*g).getRootsInInterval(0,1),P=!0,M=!1,I=void 0;try{for(var N,L=b[Symbol.iterator]();!(P=(N=L.next()).done);P=!0){var R=N.value;x.points.push(f.multiply(R*R*R).add(d.multiply(R*R).add(v.multiply(R).add(w))))}}catch(t){M=!0,I=t}finally{try{P||null==L.return||L.return()}finally{if(M)throw I}}return x.points.length>0&&(x.status="Intersection"),x},p.intersectBezier3Line=function(t,e,n,i,r,s){var a,y,u,h,l=r.min(s),x=r.max(s),f=new p("No Intersection");a=t.multiply(-1),y=e.multiply(3),u=n.multiply(-3),h=a.add(y.add(u.add(i)));var d=new o(h.x,h.y);a=t.multiply(3),y=e.multiply(-6),u=n.multiply(3),h=a.add(y.add(u));var v=new o(h.x,h.y);a=t.multiply(-3),y=e.multiply(3),u=a.add(y);var w=new o(u.x,u.y),m=new o(t.x,t.y),g=new o(r.y-s.y,s.x-r.x),b=r.x*s.y-s.x*r.y,P=new c(g.dot(d),g.dot(v),g.dot(w),g.dot(m)+b).getRoots(),M=!0,I=!1,N=void 0;try{for(var L,R=P[Symbol.iterator]();!(M=(L=R.next()).done);M=!0){var E=L.value;if(0<=E&&E<=1){var z=t.lerp(e,E),B=e.lerp(n,E),X=n.lerp(i,E),C=z.lerp(B,E),_=B.lerp(X,E),S=C.lerp(_,E);r.x==s.x?l.y<=S.y&&S.y<=x.y&&(f.status="Intersection",f.appendPoint(S)):r.y==s.y?l.x<=S.x&&S.x<=x.x&&(f.status="Intersection",f.appendPoint(S)):l.x<=S.x&&S.x<=x.x&&l.y<=S.y&&S.y<=x.y&&(f.status="Intersection",f.appendPoint(S))}}}catch(t){I=!0,N=t}finally{try{M||null==R.return||R.return()}finally{if(I)throw N}}return f},p.intersectBezier3Polygon=function(t,e,n,i,r){return this.intersectBezier3Polyline(t,e,n,i,l(r))},p.intersectBezier3Polyline=function(t,e,n,i,r){for(var s=new p("No Intersection"),o=r.length,a=0;a0&&(s.status="Intersection"),s},p.intersectBezier3Rectangle=function(t,e,n,i,r,o){var a=r.min(o),y=r.max(o),u=new s(y.x,a.y),c=new s(a.x,y.y),h=p.intersectBezier3Line(t,e,n,i,a,u),l=p.intersectBezier3Line(t,e,n,i,u,y),x=p.intersectBezier3Line(t,e,n,i,y,c),f=p.intersectBezier3Line(t,e,n,i,c,a),d=new p("No Intersection");return d.appendPoints(h.points),d.appendPoints(l.points),d.appendPoints(x.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d},p.intersectCircleCircle=function(t,e,n,i){var r,o=e+i,a=Math.abs(e-i),y=t.distanceFrom(n);if(y>o)r=new p("Outside");else if(y1)&&(c<0||c>1)?r=new p(u<0&&c<0||u>1&&c>1?"Outside":"Inside"):(r=new p("Intersection"),0<=u&&u<=1&&r.points.push(n.lerp(i,u)),0<=c&&c<=1&&r.points.push(n.lerp(i,c)))}return r},p.intersectCirclePolygon=function(t,e,n){return this.intersectCirclePolyline(t,e,l(n))},p.intersectCirclePolyline=function(t,e,n){for(var i,r=new p("No Intersection"),s=n.length,o=0;o0?r.status="Intersection":r.status=i.status,r},p.intersectCircleRectangle=function(t,e,n,i){var r=n.min(i),o=n.max(i),a=new s(o.x,r.y),y=new s(r.x,o.y),u=p.intersectCircleLine(t,e,r,a),c=p.intersectCircleLine(t,e,a,o),h=p.intersectCircleLine(t,e,o,y),l=p.intersectCircleLine(t,e,y,r),x=new p("No Intersection");return x.appendPoints(u.points),x.appendPoints(c.points),x.appendPoints(h.points),x.appendPoints(l.points),x.points.length>0?x.status="Intersection":x.status=u.status,x},p.intersectEllipseEllipse=function(t,e,n,i,r,o){for(var a=[n*n,0,e*e,-2*n*n*t.x,-2*e*e*t.y,n*n*t.x*t.x+e*e*t.y*t.y-e*e*n*n],y=[o*o,0,r*r,-2*o*o*i.x,-2*r*r*i.y,o*o*i.x*i.x+r*r*i.y*i.y-r*r*o*o],u=p.bezout(a,y).getRoots(),h=.001*(a[0]*a[0]+2*a[1]*a[1]+a[2]*a[2]),l=.001*(y[0]*y[0]+2*y[1]*y[1]+y[2]*y[2]),x=new p("No Intersection"),f=0;f0&&(x.status="Intersection"),x},p.intersectEllipseLine=function(t,e,n,i,r){var s,a=new o(i.x,i.y),y=o.fromPoints(i,r),u=new o(t.x,t.y),c=a.subtract(u),h=new o(y.x/(e*e),y.y/(n*n)),l=new o(c.x/(e*e),c.y/(n*n)),x=y.dot(h),f=y.dot(l),d=f*f-x*(t=c.dot(l)-1);if(d<0)s=new p("Outside");else if(d>0){var v=Math.sqrt(d),w=(-f-v)/x,m=(-f+v)/x;(w<0||11&&m>1?"Outside":"Inside"):(s=new p("Intersection"),0<=w&&w<=1&&s.appendPoint(i.lerp(r,w)),0<=m&&m<=1&&s.appendPoint(i.lerp(r,m)))}else{var g=-f/x;0<=g&&g<=1?(s=new p("Intersection")).appendPoint(i.lerp(r,g)):s=new p("Outside")}return s},p.intersectEllipsePolygon=function(t,e,n,i){return this.intersectEllipsePolyline(t,e,n,l(i))},p.intersectEllipsePolyline=function(t,e,n,i){for(var r=new p("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},p.intersectEllipseRectangle=function(t,e,n,i,r){var o=i.min(r),a=i.max(r),y=new s(a.x,o.y),u=new s(o.x,a.y),c=p.intersectEllipseLine(t,e,n,o,y),h=p.intersectEllipseLine(t,e,n,y,a),l=p.intersectEllipseLine(t,e,n,a,u),x=p.intersectEllipseLine(t,e,n,u,o),f=new p("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(x.points),f.points.length>0&&(f.status="Intersection"),f},p.intersectLineLine=function(t,e,n,i){var r,o=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=o/y,c=a/y;0<=u&&u<=1&&0<=c&&c<=1?(r=new p("Intersection")).points.push(new s(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y))):r=new p("No Intersection")}else r=new p(0==o||0==a?"Coincident":"Parallel");return r},p.intersectLinePolygon=function(t,e,n){return this.intersectLinePolyline(t,e,l(n))},p.intersectLinePolyline=function(t,e,n){for(var i=new p("No Intersection"),r=n.length,s=0;s0&&(i.status="Intersection"),i},p.intersectLineRectangle=function(t,e,n,i){var r=n.min(i),o=n.max(i),a=new s(o.x,r.y),y=new s(r.x,o.y),u=p.intersectLineLine(r,a,t,e),c=p.intersectLineLine(a,o,t,e),h=p.intersectLineLine(o,y,t,e),l=p.intersectLineLine(y,r,t,e),x=new p("No Intersection");return x.appendPoints(u.points),x.appendPoints(c.points),x.appendPoints(h.points),x.appendPoints(l.points),x.points.length>0&&(x.status="Intersection"),x},p.intersectPolygonPolygon=function(t,e){return this.intersectPolylinePolyline(l(t),l(e))},p.intersectPolygonPolyline=function(t,e){return this.intersectPolylinePolyline(l(t),e)},p.intersectPolygonRectangle=function(t,e,n){return this.intersectPolylineRectangle(l(t),e,n)},p.intersectPolylinePolyline=function(t,e){for(var n=new p("No Intersection"),i=t.length,r=0;r0&&(n.status="Intersection"),n},p.intersectPolylineRectangle=function(t,e,n){var i=e.min(n),r=e.max(n),o=new s(r.x,i.y),a=new s(i.x,r.y),y=p.intersectLinePolyline(i,o,t),u=p.intersectLinePolyline(o,r,t),c=p.intersectLinePolyline(r,a,t),h=p.intersectLinePolyline(a,i,t),l=new p("No Intersection");return l.appendPoints(y.points),l.appendPoints(u.points),l.appendPoints(c.points),l.appendPoints(h.points),l.points.length>0&&(l.status="Intersection"),l},p.intersectRectangleRectangle=function(t,e,n,i){var r=t.min(e),o=t.max(e),a=new s(o.x,r.y),y=new s(r.x,o.y),u=p.intersectLineRectangle(r,a,n,i),c=p.intersectLineRectangle(a,o,n,i),h=p.intersectLineRectangle(o,y,n,i),l=p.intersectLineRectangle(y,r,n,i),x=new p("No Intersection");return x.appendPoints(u.points),x.appendPoints(c.points),x.appendPoints(h.points),x.appendPoints(l.points),x.points.length>0&&(x.status="Intersection"),x},p.intersectRayRay=function(t,e,n,i){var r,o=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=o/y;(r=new p("Intersection")).points.push(new s(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y)))}else r=new p(0==o||0==a?"Coincident":"Parallel");return r},p.bezout=function(t,e){var n=t[0]*e[1]-e[0]*t[1],i=t[0]*e[2]-e[0]*t[2],r=t[0]*e[3]-e[0]*t[3],s=t[0]*e[4]-e[0]*t[4],o=t[0]*e[5]-e[0]*t[5],a=t[1]*e[2]-e[1]*t[2],y=t[1]*e[4]-e[1]*t[4],u=t[1]*e[5]-e[1]*t[5],h=t[2]*e[3]-e[2]*t[3],l=t[3]*e[4]-e[3]*t[4],p=t[3]*e[5]-e[3]*t[5],x=u+l,f=y-h;return new c(n*a-i*i,n*f+r*a-2*i*s,n*x+r*f-s*s-2*i*o,n*p+r*x-2*s*o,r*p-o*o)},x.prototype.init=function(t,e){this.name=t,this.args=e};var f={quadraticBezier:function(t,e,n,i,r,o){return new x("Bezier2",[new s(t,e),new s(n,i),new s(r,o)])},cubicBezier:function(t,e,n,i,r,o,a,y){return new x("Bezier3",[new s(t,e),new s(n,i),new s(r,o),new s(a,y)])},circle:function(t,e,n){return new x("Circle",[new s(t,e),n])},ellipse:function(t,e,n,i){return new x("Ellipse",[new s(t,e),n,i])},line:function(t,e,n,i){return new x("Line",[new s(t,e),new s(n,i)])},path:function(t){return new x("Path",t)},polygon:function(t){for(var e=[],n=0;n=0;e--)this.coefs.push(t[e]);this._variable="t",this._s=0},e.prototype.eval=function(t){if(isNaN(t))throw new Error("Polynomial.eval: parameter must be a number");for(var e=0,n=this.coefs.length-1;n>=0;n--)e=e*t+this.coefs[n];return e},e.prototype.add=function(t){for(var n=new e,i=this.getDegree(),r=t.getDegree(),s=Math.max(i,r),o=0;o<=s;o++){var a=o<=i?this.coefs[o]:0,y=o<=r?t.coefs[o]:0;n.coefs[o]=a+y}return n},e.prototype.multiply=function(t){for(var n=new e,i=0;i<=this.getDegree()+t.getDegree();i++)n.coefs.push(0);for(i=0;i<=this.getDegree();i++)for(var r=0;r<=t.getDegree();r++)n.coefs[i+r]+=this.coefs[i]*t.coefs[r];return n},e.prototype.divide_scalar=function(t){for(var e=0;e=0&&Math.abs(this.coefs[e])<=t;e--)this.coefs.pop()},e.prototype.bisection=function(t,n){var i,r=this.eval(t),s=this.eval(n);if(Math.abs(r)<=e.TOLERANCE)i=t;else if(Math.abs(s)<=e.TOLERANCE)i=n;else if(r*s<=0)for(var o=Math.log(n-t),a=Math.LN10*e.ACCURACY,y=Math.ceil((o+a)/Math.LN2),u=0;u=0;n--){var i=Math.round(1e3*this.coefs[n])/1e3;if(0!=i){var r=i<0?" - ":" + ";i=Math.abs(i),n>0&&(1==i?i=this._variable:i+=this._variable),n>1&&(i+="^"+n),e.push(r),t.push(i)}}e[0]=" + "==e[0]?"":"-";var s="";for(n=0;n=3&&(s=e.interpolate(r,i,3,o-3,0),Math.abs(s.dy)<=1e-6*s.y)));o++)i[o]=i[o-1],r[o]=.25*r[o-1];return s.y},e.prototype.getDegree=function(){return this.coefs.length-1},e.prototype.getDerivative=function(){for(var t=new e,n=1;n0){for(null!=(n=this.bisection(t,s[0]))&&r.push(n),i=0;i<=s.length-2;i++)null!=(n=this.bisection(s[i],s[i+1]))&&r.push(n);null!=(n=this.bisection(s[s.length-1],e))&&r.push(n)}else null!=(n=this.bisection(t,e))&&r.push(n)}return r},e.prototype.getLinearRoot=function(){var t=[],e=this.coefs[1];return 0!=e&&t.push(-this.coefs[0]/e),t},e.prototype.getQuadraticRoots=function(){var t=[];if(2==this.getDegree()){var e=this.coefs[2],n=this.coefs[1]/e,i=n*n-4*(this.coefs[0]/e);if(i>0){var r=Math.sqrt(i);t.push(.5*(-n+r)),t.push(.5*(-n-r))}else 0==i&&t.push(.5*-n)}return t},e.prototype.getCubicRoots=function(){var t=[];if(3==this.getDegree()){var e=this.coefs[3],n=this.coefs[2]/e,i=this.coefs[1]/e,r=(3*i-n*n)/3,s=(2*n*n*n-9*i*n+27*(this.coefs[0]/e))/27,o=n/3,a=s*s/4+r*r*r/27,y=s/2,u=this.zeroErrorEstimate();if(Math.abs(a)<=u&&(a=0),a>0){var c,l=Math.sqrt(a);c=(v=-y+l)>=0?Math.pow(v,1/3):-Math.pow(-v,1/3),(v=-y-l)>=0?c+=Math.pow(v,1/3):c-=Math.pow(-v,1/3),t.push(c-o)}else if(a<0){var h=Math.sqrt(-r/3),p=Math.atan2(Math.sqrt(-a),-y)/3,x=Math.cos(p),f=Math.sin(p),d=Math.sqrt(3);t.push(2*h*x-o),t.push(-h*(x+d*f)-o),t.push(-h*(x-d*f)-o)}else{var v;v=y>=0?-Math.pow(y,1/3):Math.pow(-y,1/3),t.push(2*v-o),t.push(-v-o)}}return t};var n=function(t){return"number"==typeof t?t?t<0?-1:1:t==t?t:NaN:NaN};e.prototype.getQuarticRoots=function(){var t=[],i=this.getDegree();if(4==i){var r=new e;r.coefs=this.coefs.slice(),r.divide_scalar(r.coefs[i]);Math.abs(r.coefs[0])<10*1e-15*Math.abs(r.coefs[3])&&(r.coefs[0]=0);var s,o=r.getDerivative(),a=o.getRoots().sort(function(t,e){return t-e}),y=[],u=a.length-1,c=this.bounds();maxabsX=Math.max(Math.abs(c.minX),Math.abs(c.maxX));var l=this.zeroErrorEstimate(maxabsX);for(s=0;s<=u;s++)y.push(r.eval(a[s]));for(s=0;s<=u;s++)Math.abs(y[s])-1){for(0!=y[0]?n(y[0])!=n(r.eval(a[0]-h)-y[0])&&(p.push(a[0]-h),x.push([c.minX,a[0]])):(t.push(a[0],a[0]),s++);s0)for(s=0;se?s:e},0)},e.prototype.bounds_UpperReal_Fujiwara=function(){var t=this.coefs,e=t.length-1,n=t[e];1!=n&&(t=this.coefs.map(function(t){return t/n}));var i,r=t.map(function(t,n){return n0)},{negX:-2*r.reduce(s,{max:0,nearmax:0}).max,posX:2*o.max}},e.prototype.bounds_LowerReal_Fujiwara=function(){var t=new e;t.coefs=this.coefs.slice().reverse();var n=t.bounds_UpperReal_Fujiwara();return n.negX=1/n.negX,n.posX=1/n.posX,n},e.prototype.bounds=function(){var t=this.bounds_UpperReal_Fujiwara(),e={minX:t.negX,maxX:t.posX};return 0===t.negX&&0===t.posX?e:(0===t.negX?e.minX=this.bounds_LowerReal_Fujiwara().posX:0===t.posX&&(e.maxX=this.bounds_LowerReal_Fujiwara().negX),e.minX>e.maxX&&(e.minX=e.maxX=0),e)},e.newton_secant_bisection=function(t,e,i,r,s,o){var a,u,c,l,h,p,x=0,f=0;a=t;var d=Math.pow(10,-14),v="number"==typeof s&&"number"==typeof o;if(v){if(s>o)throw new Error("newton root finding: min must be greater than max");if(h=e(s),p=e(o),n(h)==n(p))throw new Error("newton root finding: y values of bounds must be of opposite sign")}var w,m=function(){return Math.abs(c)<=d*Math.abs(a)||f==a-c-a};for(w=0;wo){if(n(h)==n(p))break;var g=p-h,b=o-s;if(c=0==g?a-(s+.5*b):Math.abs(g/Math.min(h,p))>50?a-(s+b*(.5+(Math.abs(h)0&&(n.status="Intersection"),n},d.intersectBezier2Bezier2=function(t,e,n,i,r,s){var o,a,y=new d("No Intersection");o=e.multiply(-2);var c=t.add(o.add(n));o=t.multiply(-2),a=e.multiply(2);var l=o.add(a),h=new u(t.x,t.y);o=r.multiply(-2);var x=i.add(o.add(s));o=i.multiply(-2),a=r.multiply(2);var f=o.add(a),v=new u(i.x,i.y);o=c.x*l.y-l.x*c.y,a=x.x*l.y-l.x*x.y;var w=f.x*l.y-l.x*f.y,m=l.x*(h.y-v.y)+l.y*(-h.x+v.x),g=x.x*c.y-c.x*x.y,b=f.x*c.y-c.x*f.y,P=c.x*(h.y-v.y)+c.y*(-h.x+v.x),M=new p(-g*g,-2*g*b,o*a-b*b-2*g*P,o*w-2*b*P,o*m-P*P).getRoots(),I=!0,N=!1,L=void 0;try{for(var R,E=M[Symbol.iterator]();!(I=(R=E.next()).done);I=!0){var z=R.value;if(0<=z&&z<=1){var B=new p(c.x,l.x,h.x-v.x-z*f.x-z*z*x.x);B.simplify();var X=B.getRoots(),C=new p(c.y,l.y,h.y-v.y-z*f.y-z*z*x.y);C.simplify();var _=C.getRoots();if(X.length>0&&_.length>0){var S=!0,q=!1,k=void 0;try{t:for(var A,D=X[Symbol.iterator]();!(S=(A=D.next()).done);S=!0){var O=A.value;if(0<=O&&O<=1)for(var T=0;T<_.length;T++)if(Math.abs(O-_[T])<1e-4){y.points.push(x.multiply(z*z).add(f.multiply(z).add(v)));break t}}}catch(t){q=!0,k=t}finally{try{S||null==D.return||D.return()}finally{if(q)throw k}}}}}}catch(t){N=!0,L=t}finally{try{I||null==E.return||E.return()}finally{if(N)throw L}}return y.points.length>0&&(y.status="Intersection"),y},d.intersectBezier2Bezier3=function(t,e,n,i,r,s,o){var a,y,l,h,x=new d("No Intersection");a=e.multiply(-2);var f=t.add(a.add(n));a=t.multiply(-2),y=e.multiply(2);var v=a.add(y),w=new u(t.x,t.y);a=i.multiply(-1),y=r.multiply(3),l=s.multiply(-3),h=a.add(y.add(l.add(o)));var m=new c(h.x,h.y);a=i.multiply(3),y=r.multiply(-6),l=s.multiply(3),h=a.add(y.add(l));var g=new c(h.x,h.y);a=i.multiply(-3),y=r.multiply(3),l=a.add(y);var b=new c(l.x,l.y),P=new c(i.x,i.y),M=w.x*w.x,I=w.y*w.y,N=v.x*v.x,L=v.y*v.y,R=f.x*f.x,E=f.y*f.y,z=P.x*P.x,B=P.y*P.y,X=b.x*b.x,C=b.y*b.y,_=g.x*g.x,S=g.y*g.y,q=m.x*m.x,k=m.y*m.y,A=new p(-2*f.x*f.y*m.x*m.y+R*k+E*q,-2*f.x*f.y*g.x*m.y-2*f.x*f.y*g.y*m.x+2*E*g.x*m.x+2*R*g.y*m.y,-2*f.x*b.x*f.y*m.y-2*f.x*f.y*b.y*m.x-2*f.x*f.y*g.x*g.y+2*b.x*E*m.x+E*_+R*(2*b.y*m.y+S),2*w.x*f.x*f.y*m.y+2*w.y*f.x*f.y*m.x+v.x*v.y*f.x*m.y+v.x*v.y*f.y*m.x-2*P.x*f.x*f.y*m.y-2*f.x*P.y*f.y*m.x-2*f.x*b.x*f.y*g.y-2*f.x*f.y*b.y*g.x-2*w.x*E*m.x-2*w.y*R*m.y+2*P.x*E*m.x+2*b.x*E*g.x-L*f.x*m.x-N*f.y*m.y+R*(2*P.y*m.y+2*b.y*g.y),2*w.x*f.x*f.y*g.y+2*w.y*f.x*f.y*g.x+v.x*v.y*f.x*g.y+v.x*v.y*f.y*g.x-2*P.x*f.x*f.y*g.y-2*f.x*P.y*f.y*g.x-2*f.x*b.x*f.y*b.y-2*w.x*E*g.x-2*w.y*R*g.y+2*P.x*E*g.x-L*f.x*g.x-N*f.y*g.y+X*E+R*(2*P.y*g.y+C),2*w.x*f.x*f.y*b.y+2*w.y*f.x*b.x*f.y+v.x*v.y*f.x*b.y+v.x*v.y*b.x*f.y-2*P.x*f.x*f.y*b.y-2*f.x*P.y*b.x*f.y-2*w.x*b.x*E-2*w.y*R*b.y+2*P.x*b.x*E-L*f.x*b.x-N*f.y*b.y+2*R*P.y*b.y,-2*w.x*w.y*f.x*f.y-w.x*v.x*v.y*f.y-w.y*v.x*v.y*f.x+2*w.x*f.x*P.y*f.y+2*w.y*P.x*f.x*f.y+v.x*P.x*v.y*f.y+v.x*v.y*f.x*P.y-2*P.x*f.x*P.y*f.y-2*w.x*P.x*E+w.x*L*f.x+w.y*N*f.y-2*w.y*R*P.y-P.x*L*f.x-N*P.y*f.y+M*E+I*R+z*E+R*B).getRootsInInterval(0,1),D=!0,O=!1,T=void 0;try{for(var j,F=A[Symbol.iterator]();!(D=(j=F.next()).done);D=!0){var U=j.value,Y=new p(f.x,v.x,w.x-P.x-U*b.x-U*U*g.x-U*U*U*m.x).getRoots(),Q=new p(f.y,v.y,w.y-P.y-U*b.y-U*U*g.y-U*U*U*m.y).getRoots();if(Y.length>0&&Q.length>0){var V=!0,G=!1,H=void 0;try{t:for(var J,K=Y[Symbol.iterator]();!(V=(J=K.next()).done);V=!0){var W=J.value;if(0<=W&&W<=1)for(var Z=0;Z0&&(x.status="Intersection"),x},d.intersectBezier2Circle=function(t,e,n,i,r){return d.intersectBezier2Ellipse(t,e,n,i,r,r)},d.intersectBezier2Ellipse=function(t,e,n,i,r,s){var o,a=new d("No Intersection");o=e.multiply(-2);var y=t.add(o.add(n));o=t.multiply(-2);var c=e.multiply(2),l=o.add(c),h=new u(t.x,t.y),x=r*r,f=s*s,v=new p(f*y.x*y.x+x*y.y*y.y,2*(f*y.x*l.x+x*y.y*l.y),f*(2*y.x*h.x+l.x*l.x)+x*(2*y.y*h.y+l.y*l.y)-2*(f*i.x*y.x+x*i.y*y.y),2*(f*l.x*(h.x-i.x)+x*l.y*(h.y-i.y)),f*(h.x*h.x+i.x*i.x)+x*(h.y*h.y+i.y*i.y)-2*(f*i.x*h.x+x*i.y*h.y)-x*f).getRoots(),w=!0,m=!1,g=void 0;try{for(var b,P=v[Symbol.iterator]();!(w=(b=P.next()).done);w=!0){var M=b.value;0<=M&&M<=1&&a.points.push(y.multiply(M*M).add(l.multiply(M).add(h)))}}catch(t){m=!0,g=t}finally{try{w||null==P.return||P.return()}finally{if(m)throw g}}return a.points.length>0&&(a.status="Intersection"),a},d.intersectBezier2Line=function(t,e,n,i,r){var s,o=i.min(r),a=i.max(r),y=new d("No Intersection");s=e.multiply(-2);var l=t.add(s.add(n));s=t.multiply(-2);var h=e.multiply(2),x=s.add(h),f=new u(t.x,t.y),v=new c(i.y-r.y,r.x-i.x),w=i.x*r.y-r.x*i.y,m=new p(v.dot(l),v.dot(x),v.dot(f)+w).getRoots(),g=!0,b=!1,P=void 0;try{for(var M,I=m[Symbol.iterator]();!(g=(M=I.next()).done);g=!0){var N=M.value;if(0<=N&&N<=1){var L=t.lerp(e,N),R=e.lerp(n,N),E=L.lerp(R,N);i.x==r.x?o.y<=E.y&&E.y<=a.y&&(y.status="Intersection",y.appendPoint(E)):i.y==r.y?o.x<=E.x&&E.x<=a.x&&(y.status="Intersection",y.appendPoint(E)):o.x<=E.x&&E.x<=a.x&&o.y<=E.y&&E.y<=a.y&&(y.status="Intersection",y.appendPoint(E))}}}catch(t){b=!0,P=t}finally{try{g||null==I.return||I.return()}finally{if(b)throw P}}return y},d.intersectBezier2Polygon=function(t,e,n,i){return d.intersectBezier2Polyline(t,e,n,f(i))},d.intersectBezier2Polyline=function(t,e,n,i){for(var r=new d("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},d.intersectBezier2Rectangle=function(t,e,n,i,r){var s=i.min(r),o=i.max(r),a=new u(o.x,s.y),y=new u(s.x,o.y),c=d.intersectBezier2Line(t,e,n,s,a),l=d.intersectBezier2Line(t,e,n,a,o),h=d.intersectBezier2Line(t,e,n,o,y),p=d.intersectBezier2Line(t,e,n,y,s),x=new d("No Intersection");return x.appendPoints(c.points),x.appendPoints(l.points),x.appendPoints(h.points),x.appendPoints(p.points),x.points.length>0&&(x.status="Intersection"),x},d.intersectBezier3Bezier3=function(t,e,n,i,r,s,o,a){var y,u,l,h,x=new d("No Intersection");y=t.multiply(-1),u=e.multiply(3),l=n.multiply(-3),h=y.add(u.add(l.add(i)));var f=new c(h.x,h.y);y=t.multiply(3),u=e.multiply(-6),l=n.multiply(3),h=y.add(u.add(l));var v=new c(h.x,h.y);y=t.multiply(-3),u=e.multiply(3),l=y.add(u);var w=new c(l.x,l.y),m=new c(t.x,t.y);y=r.multiply(-1),u=s.multiply(3),l=o.multiply(-3),h=y.add(u.add(l.add(a)));var g=new c(h.x,h.y);y=r.multiply(3),u=s.multiply(-6),l=o.multiply(3),h=y.add(u.add(l));var b=new c(h.x,h.y);y=r.multiply(-3),u=s.multiply(3),l=y.add(u);var P=new c(l.x,l.y),M=new c(r.x,r.y);y=f.x*v.y-v.x*f.y,u=f.x*w.y-w.x*f.y;var I=f.x*m.y-m.x*f.y+M.x*f.y-f.x*M.y,N=P.x*f.y-f.x*P.y,L=b.x*f.y-f.x*b.y,R=g.x*f.y-f.x*g.y;h=f.x*w.y-w.x*f.y;var E=f.x*m.y+v.x*w.y-w.x*v.y-m.x*f.y+M.x*f.y-f.x*M.y,z=P.x*f.y-f.x*P.y,B=b.x*f.y-f.x*b.y,X=g.x*f.y-f.x*g.y,C=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,_=P.x*v.y-v.x*P.y,S=b.x*v.y-v.x*b.y,q=g.x*v.y-v.x*g.y,k=f.x*m.y-m.x*f.y+M.x*f.y-f.x*M.y,A=P.x*f.y-f.x*P.y,D=b.x*f.y-f.x*b.y,O=g.x*f.y-f.x*g.y,T=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,j=P.x*v.y-v.x*P.y,F=b.x*v.y-v.x*b.y,U=g.x*v.y-v.x*g.y,Y=w.x*m.y-m.x*w.y+M.x*w.y-w.x*M.y,Q=P.x*w.y-w.x*P.y,V=b.x*w.y-w.x*b.y,G=g.x*w.y-w.x*g.y,H=new p(-R*X*O,-R*X*D-R*B*O-L*X*O,-R*X*A-R*B*D-L*X*D-R*z*O-L*B*O-N*X*O,-R*X*k-R*B*A-L*X*A-R*z*D-L*B*D-N*X*D-R*E*O-L*z*O-N*B*O-I*X*O+u*q*O+R*h*U-y*q*U+y*X*G,-R*B*k-L*X*k-R*z*A-L*B*A-N*X*A-R*E*D-L*z*D-N*B*D-I*X*D+u*q*D-L*E*O-N*z*O-I*B*O+u*S*O+R*h*F-y*q*F+L*h*U-y*S*U+y*X*V+y*B*G,-R*z*k-L*B*k-N*X*k-R*E*A-L*z*A-N*B*A-I*X*A+u*q*A-L*E*D-N*z*D-I*B*D+u*S*D-N*E*O-I*z*O+u*_*O+R*h*j-y*q*j+L*h*F-y*S*F+N*h*U-y*_*U+y*X*Q+y*B*V+y*z*G,-R*E*k-L*z*k-N*B*k-I*X*k+u*q*k-L*E*A-N*z*A-I*B*A+u*S*A-N*E*D-I*z*D+u*_*D-I*E*O+u*C*O+R*h*T-y*q*T+L*h*j-y*S*j+N*h*F-y*_*F+I*h*U-y*C*U+y*X*Y+y*B*Q+y*z*V-u*h*G+y*E*G,-L*E*k-N*z*k-I*B*k+u*S*k-N*E*A-I*z*A+u*_*A-I*E*D+u*C*D+L*h*T-y*S*T+N*h*j-y*_*j+I*h*F-y*C*F+y*B*Y+y*z*Q-u*h*V+y*E*V,-N*E*k-I*z*k+u*_*k-I*E*A+u*C*A+N*h*T-y*_*T+I*h*j-y*C*j+y*z*Y-u*h*Q+y*E*Q,-I*E*k+u*C*k+I*h*T-y*C*T-u*h*Y+y*E*Y);H.simplify();var J=H.getRootsInInterval(0,1),K=!0,W=!1,Z=void 0;try{for(var $,tt=J[Symbol.iterator]();!(K=($=tt.next()).done);K=!0){var et=$.value,nt=new p(f.x,v.x,w.x,m.x-M.x-et*P.x-et*et*b.x-et*et*et*g.x);nt.simplify();var it=nt.getRoots(),rt=new p(f.y,v.y,w.y,m.y-M.y-et*P.y-et*et*b.y-et*et*et*g.y);rt.simplify();var st=rt.getRoots();if(it.length>0&&st.length>0){var ot=!0,at=!1,yt=void 0;try{t:for(var ut,ct=it[Symbol.iterator]();!(ot=(ut=ct.next()).done);ot=!0){var lt=ut.value;if(0<=lt&<<=1)for(var ht=0;ht0&&(x.status="Intersection"),x},d.intersectBezier3Circle=function(t,e,n,i,r,s){return d.intersectBezier3Ellipse(t,e,n,i,r,s,s)},d.intersectBezier3Ellipse=function(t,e,n,i,r,s,o){var a,y,u,l,h=new d("No Intersection");a=t.multiply(-1),y=e.multiply(3),u=n.multiply(-3),l=a.add(y.add(u.add(i)));var x=new c(l.x,l.y);a=t.multiply(3),y=e.multiply(-6),u=n.multiply(3),l=a.add(y.add(u));var f=new c(l.x,l.y);a=t.multiply(-3),y=e.multiply(3),u=a.add(y);var v=new c(u.x,u.y),w=new c(t.x,t.y),m=s*s,g=o*o,b=new p(x.x*x.x*g+x.y*x.y*m,2*(x.x*f.x*g+x.y*f.y*m),2*(x.x*v.x*g+x.y*v.y*m)+f.x*f.x*g+f.y*f.y*m,2*x.x*g*(w.x-r.x)+2*x.y*m*(w.y-r.y)+2*(f.x*v.x*g+f.y*v.y*m),2*f.x*g*(w.x-r.x)+2*f.y*m*(w.y-r.y)+v.x*v.x*g+v.y*v.y*m,2*v.x*g*(w.x-r.x)+2*v.y*m*(w.y-r.y),w.x*w.x*g-2*w.y*r.y*m-2*w.x*r.x*g+w.y*w.y*m+r.x*r.x*g+r.y*r.y*m-m*g).getRootsInInterval(0,1),P=!0,M=!1,I=void 0;try{for(var N,L=b[Symbol.iterator]();!(P=(N=L.next()).done);P=!0){var R=N.value;h.points.push(x.multiply(R*R*R).add(f.multiply(R*R).add(v.multiply(R).add(w))))}}catch(t){M=!0,I=t}finally{try{P||null==L.return||L.return()}finally{if(M)throw I}}return h.points.length>0&&(h.status="Intersection"),h},d.intersectBezier3Line=function(t,e,n,i,r,s){var o,a,y,u,l=r.min(s),h=r.max(s),x=new d("No Intersection");o=t.multiply(-1),a=e.multiply(3),y=n.multiply(-3),u=o.add(a.add(y.add(i)));var f=new c(u.x,u.y);o=t.multiply(3),a=e.multiply(-6),y=n.multiply(3),u=o.add(a.add(y));var v=new c(u.x,u.y);o=t.multiply(-3),a=e.multiply(3),y=o.add(a);var w=new c(y.x,y.y),m=new c(t.x,t.y),g=new c(r.y-s.y,s.x-r.x),b=r.x*s.y-s.x*r.y,P=new p(g.dot(f),g.dot(v),g.dot(w),g.dot(m)+b).getRoots(),M=!0,I=!1,N=void 0;try{for(var L,R=P[Symbol.iterator]();!(M=(L=R.next()).done);M=!0){var E=L.value;if(0<=E&&E<=1){var z=t.lerp(e,E),B=e.lerp(n,E),X=n.lerp(i,E),C=z.lerp(B,E),_=B.lerp(X,E),S=C.lerp(_,E);r.x==s.x?l.y<=S.y&&S.y<=h.y&&(x.status="Intersection",x.appendPoint(S)):r.y==s.y?l.x<=S.x&&S.x<=h.x&&(x.status="Intersection",x.appendPoint(S)):l.x<=S.x&&S.x<=h.x&&l.y<=S.y&&S.y<=h.y&&(x.status="Intersection",x.appendPoint(S))}}}catch(t){I=!0,N=t}finally{try{M||null==R.return||R.return()}finally{if(I)throw N}}return x},d.intersectBezier3Polygon=function(t,e,n,i,r){return this.intersectBezier3Polyline(t,e,n,i,f(r))},d.intersectBezier3Polyline=function(t,e,n,i,r){for(var s=new d("No Intersection"),o=r.length,a=0;a0&&(s.status="Intersection"),s},d.intersectBezier3Rectangle=function(t,e,n,i,r,s){var o=r.min(s),a=r.max(s),y=new u(a.x,o.y),c=new u(o.x,a.y),l=d.intersectBezier3Line(t,e,n,i,o,y),h=d.intersectBezier3Line(t,e,n,i,y,a),p=d.intersectBezier3Line(t,e,n,i,a,c),x=d.intersectBezier3Line(t,e,n,i,c,o),f=new d("No Intersection");return f.appendPoints(l.points),f.appendPoints(h.points),f.appendPoints(p.points),f.appendPoints(x.points),f.points.length>0&&(f.status="Intersection"),f},d.intersectCircleCircle=function(t,e,n,i){var r,s=e+i,o=Math.abs(e-i),a=t.distanceFrom(n);if(a>s)r=new d("Outside");else if(a1)&&(c<0||c>1)?r=new d(u<0&&c<0||u>1&&c>1?"Outside":"Inside"):(r=new d("Intersection"),0<=u&&u<=1&&r.points.push(n.lerp(i,u)),0<=c&&c<=1&&r.points.push(n.lerp(i,c)))}return r},d.intersectCirclePolygon=function(t,e,n){return this.intersectCirclePolyline(t,e,f(n))},d.intersectCirclePolyline=function(t,e,n){for(var i,r=new d("No Intersection"),s=n.length,o=0;o0?r.status="Intersection":r.status=i.status,r},d.intersectCircleRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),o=new u(s.x,r.y),a=new u(r.x,s.y),y=d.intersectCircleLine(t,e,r,o),c=d.intersectCircleLine(t,e,o,s),l=d.intersectCircleLine(t,e,s,a),h=d.intersectCircleLine(t,e,a,r),p=new d("No Intersection");return p.appendPoints(y.points),p.appendPoints(c.points),p.appendPoints(l.points),p.appendPoints(h.points),p.points.length>0?p.status="Intersection":p.status=y.status,p},d.intersectEllipseEllipse=function(t,e,n,i,r,s){for(var o=[n*n,0,e*e,-2*n*n*t.x,-2*e*e*t.y,n*n*t.x*t.x+e*e*t.y*t.y-e*e*n*n],a=[s*s,0,r*r,-2*s*s*i.x,-2*r*r*i.y,s*s*i.x*i.x+r*r*i.y*i.y-r*r*s*s],y=d.bezout(o,a).getRoots(),c=.001*(o[0]*o[0]+2*o[1]*o[1]+o[2]*o[2]),l=.001*(a[0]*a[0]+2*a[1]*a[1]+a[2]*a[2]),h=new d("No Intersection"),x=0;x0&&(h.status="Intersection"),h},d.intersectEllipseLine=function(t,e,n,i,r){var s,o=new c(i.x,i.y),a=c.fromPoints(i,r),y=new c(t.x,t.y),u=o.subtract(y),l=new c(a.x/(e*e),a.y/(n*n)),h=new c(u.x/(e*e),u.y/(n*n)),p=a.dot(l),x=a.dot(h),f=x*x-p*(t=u.dot(h)-1);if(f<0)s=new d("Outside");else if(f>0){var v=Math.sqrt(f),w=(-x-v)/p,m=(-x+v)/p;(w<0||11&&m>1?"Outside":"Inside"):(s=new d("Intersection"),0<=w&&w<=1&&s.appendPoint(i.lerp(r,w)),0<=m&&m<=1&&s.appendPoint(i.lerp(r,m)))}else{var g=-x/p;0<=g&&g<=1?(s=new d("Intersection")).appendPoint(i.lerp(r,g)):s=new d("Outside")}return s},d.intersectEllipsePolygon=function(t,e,n,i){return this.intersectEllipsePolyline(t,e,n,f(i))},d.intersectEllipsePolyline=function(t,e,n,i){for(var r=new d("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},d.intersectEllipseRectangle=function(t,e,n,i,r){var s=i.min(r),o=i.max(r),a=new u(o.x,s.y),y=new u(s.x,o.y),c=d.intersectEllipseLine(t,e,n,s,a),l=d.intersectEllipseLine(t,e,n,a,o),h=d.intersectEllipseLine(t,e,n,o,y),p=d.intersectEllipseLine(t,e,n,y,s),x=new d("No Intersection");return x.appendPoints(c.points),x.appendPoints(l.points),x.appendPoints(h.points),x.appendPoints(p.points),x.points.length>0&&(x.status="Intersection"),x},d.intersectLineLine=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),o=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),a=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=a){var y=s/a,c=o/a;0<=y&&y<=1&&0<=c&&c<=1?(r=new d("Intersection")).points.push(new u(t.x+y*(e.x-t.x),t.y+y*(e.y-t.y))):r=new d("No Intersection")}else r=new d(0==s||0==o?"Coincident":"Parallel");return r},d.intersectLinePolygon=function(t,e,n){return this.intersectLinePolyline(t,e,f(n))},d.intersectLinePolyline=function(t,e,n){for(var i=new d("No Intersection"),r=n.length,s=0;s0&&(i.status="Intersection"),i},d.intersectLineRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),o=new u(s.x,r.y),a=new u(r.x,s.y),y=d.intersectLineLine(r,o,t,e),c=d.intersectLineLine(o,s,t,e),l=d.intersectLineLine(s,a,t,e),h=d.intersectLineLine(a,r,t,e),p=new d("No Intersection");return p.appendPoints(y.points),p.appendPoints(c.points),p.appendPoints(l.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p},d.intersectPolygonPolygon=function(t,e){return this.intersectPolylinePolyline(f(t),f(e))},d.intersectPolygonPolyline=function(t,e){return this.intersectPolylinePolyline(f(t),e)},d.intersectPolygonRectangle=function(t,e,n){return this.intersectPolylineRectangle(f(t),e,n)},d.intersectPolylinePolyline=function(t,e){for(var n=new d("No Intersection"),i=t.length,r=0;r0&&(n.status="Intersection"),n},d.intersectPolylineRectangle=function(t,e,n){var i=e.min(n),r=e.max(n),s=new u(r.x,i.y),o=new u(i.x,r.y),a=d.intersectLinePolyline(i,s,t),y=d.intersectLinePolyline(s,r,t),c=d.intersectLinePolyline(r,o,t),l=d.intersectLinePolyline(o,i,t),h=new d("No Intersection");return h.appendPoints(a.points),h.appendPoints(y.points),h.appendPoints(c.points),h.appendPoints(l.points),h.points.length>0&&(h.status="Intersection"),h},d.intersectRectangleRectangle=function(t,e,n,i){var r=t.min(e),s=t.max(e),o=new u(s.x,r.y),a=new u(r.x,s.y),y=d.intersectLineRectangle(r,o,n,i),c=d.intersectLineRectangle(o,s,n,i),l=d.intersectLineRectangle(s,a,n,i),h=d.intersectLineRectangle(a,r,n,i),p=new d("No Intersection");return p.appendPoints(y.points),p.appendPoints(c.points),p.appendPoints(l.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p},d.intersectRayRay=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),o=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),a=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=a){var y=s/a;(r=new d("Intersection")).points.push(new u(t.x+y*(e.x-t.x),t.y+y*(e.y-t.y)))}else r=new d(0==s||0==o?"Coincident":"Parallel");return r},d.bezout=function(t,e){var n=t[0]*e[1]-e[0]*t[1],i=t[0]*e[2]-e[0]*t[2],r=t[0]*e[3]-e[0]*t[3],s=t[0]*e[4]-e[0]*t[4],o=t[0]*e[5]-e[0]*t[5],a=t[1]*e[2]-e[1]*t[2],y=t[1]*e[4]-e[1]*t[4],u=t[1]*e[5]-e[1]*t[5],c=t[2]*e[3]-e[2]*t[3],l=t[3]*e[4]-e[3]*t[4],h=t[3]*e[5]-e[3]*t[5],x=u+l,f=y-c;return new p(n*a-i*i,n*f+r*a-2*i*s,n*x+r*f-s*s-2*i*o,n*h+r*x-2*s*o,r*h-o*o)};var v=function(){function e(n,i){t(this,e),this.init(n,i)}return n(e,[{key:"init",value:function(t,e){this.name=t,this.args=e}}]),e}(),w={quadraticBezier:function(t,e,n,i,r,s){return new v("Bezier2",[new u(t,e),new u(n,i),new u(r,s)])},cubicBezier:function(t,e,n,i,r,s,o,a){return new v("Bezier3",[new u(t,e),new u(n,i),new u(r,s),new u(o,a)])},circle:function(t,e,n){return new v("Circle",[new u(t,e),n])},ellipse:function(t,e,n,i){return new v("Ellipse",[new u(t,e),n,i])},line:function(t,e,n,i){return new v("Line",[new u(t,e),new u(n,i)])},path:function(t){return new v("Path",t)},polygon:function(t){for(var e=[],n=0;n\n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n * @class\n * @param {string} status\n */\nfunction Intersection(status) {\n this.init(status);\n}\n\n\n/**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\nIntersection.prototype.init = function(status) {\n this.status = status;\n this.points = [];\n};\n\n\n/**\n * appendPoint\n *\n * @param {Point2D} point\n */\nIntersection.prototype.appendPoint = function(point) {\n this.points.push(point);\n};\n\n\n/**\n * appendPoints\n *\n * @param {Array} points\n */\nIntersection.prototype.appendPoints = function(points) {\n this.points = this.points.concat(points);\n};\n\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\nfunction IntersectionArgs(name, args) {\n this.init(name, args);\n}\n\n/**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\nIntersectionArgs.prototype.init = function(name, args) {\n this.name = name;\n this.args = args;\n};\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","IntersectionArgs","name","args","appendPoint","point","appendPoints","intersect","shape1","shape2","intersectPathShape","method","apply","path","shape","segment","inter","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-esm.min.js","sources":["../node_modules/kld-affine/lib/Point2D.js","../node_modules/kld-affine/lib/Vector2D.js","../node_modules/kld-affine/lib/Matrix2D.js","../node_modules/kld-affine/index.js","../node_modules/kld-polynomial/lib/Polynomial.js","../node_modules/kld-polynomial/lib/SqrtPolynomial.js","../node_modules/kld-polynomial/index.js","../lib/Intersection.js","../lib/IntersectionArgs.js","../lib/Shapes.js","../lib/AffineShapes.js","../lib/IntersectionQuery.js"],"sourcesContent":["/**\n *\n * Point2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Point2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Point2D}\n */\nfunction Point2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * clone\n *\n * @returns {Point2D}\n */\nPoint2D.prototype.clone = function() {\n return new this.constructor(this.x, this.y);\n};\n\n/**\n * add\n *\n * @param {Point2D|Vector2D} that\n * @returns {Point2D}\n */\nPoint2D.prototype.add = function(that) {\n return new this.constructor(this.x+that.x, this.y+that.y);\n};\n\n/**\n * subtract\n *\n * @param { Vector2D | Point2D } that\n * @returns {Point2D}\n */\nPoint2D.prototype.subtract = function(that) {\n return new this.constructor(this.x-that.x, this.y-that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x*scalar, this.y*scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x/scalar, this.y/scalar);\n};\n\n/**\n * equals\n *\n * @param {Point2D} that\n * @returns {Boolean}\n */\nPoint2D.prototype.equals = function(that) {\n return ( this.x === that.x && this.y === that.y );\n};\n\n/**\n * precisionEquals\n *\n * @param {Point2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nPoint2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n// utility methods\n\n/**\n * lerp\n *\n * @param { Vector2D | Point2D } that\n * @param {Number} t\n @ @returns {Point2D}\n */\nPoint2D.prototype.lerp = function(that, t) {\n var omt = 1.0 - t;\n\n return new this.constructor(\n this.x * omt + that.x * t,\n this.y * omt + that.y * t\n );\n};\n\n/**\n * distanceFrom\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.distanceFrom = function(that) {\n var dx = this.x - that.x;\n var dy = this.y - that.y;\n\n return Math.sqrt(dx*dx + dy*dy);\n};\n\n/**\n * min\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.min = function(that) {\n return new this.constructor(\n Math.min( this.x, that.x ),\n Math.min( this.y, that.y )\n );\n};\n\n/**\n * max\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.max = function(that) {\n return new this.constructor(\n Math.max( this.x, that.x ),\n Math.max( this.y, that.y )\n );\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @result {Point2D}\n */\nPoint2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y + matrix.e,\n matrix.b * this.x + matrix.d * this.y + matrix.f\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nPoint2D.prototype.toString = function() {\n return \"point(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Point2D;\n}\n","/**\n *\n * Vector2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Vector2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Vector2D}\n */\nfunction Vector2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * fromPoints\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {Vector2D}\n */\nVector2D.fromPoints = function(p1, p2) {\n return new Vector2D(\n p2.x - p1.x,\n p2.y - p1.y\n );\n};\n\n/**\n * length\n *\n * @returns {Number}\n */\nVector2D.prototype.length = function() {\n return Math.sqrt(this.x*this.x + this.y*this.y);\n};\n\n/**\n * magnitude\n *\n * @returns {Number}\n */\nVector2D.prototype.magnitude = function() {\n return this.x*this.x + this.y*this.y;\n};\n\n/**\n * dot\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.dot = function(that) {\n return this.x*that.x + this.y*that.y;\n};\n\n/**\n * cross\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.cross = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * determinant\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.determinant = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * unit\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.unit = function() {\n return this.divide( this.length() );\n};\n\n/**\n * add\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.add = function(that) {\n return new this.constructor(this.x + that.x, this.y + that.y);\n};\n\n/**\n * subtract\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.subtract = function(that) {\n return new this.constructor(this.x - that.x, this.y - that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x * scalar, this.y * scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x / scalar, this.y / scalar);\n};\n\n/**\n * angleBetween\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.angleBetween = function(that) {\n var cos = this.dot(that) / (this.length() * that.length());\n cos = Math.max(-1, Math.min(cos, 1));\n var radians = Math.acos(cos);\n\n return (this.cross(that) < 0.0) ? -radians : radians;\n};\n\n/**\n * Find a vector is that is perpendicular to this vector\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.perp = function() {\n return new this.constructor(-this.y, this.x);\n};\n\n/**\n * Find the component of the specified vector that is perpendicular to\n * this vector\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.perpendicular = function(that) {\n return this.subtract(this.project(that));\n};\n\n/**\n * project\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.project = function(that) {\n var percent = this.dot(that) / that.dot(that);\n\n return that.multiply(percent);\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @returns {Vector2D}\n */\nVector2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y,\n matrix.b * this.x + matrix.d * this.y\n );\n};\n\n/**\n * equals\n *\n * @param {Vector2D} that\n * @returns {Boolean}\n */\nVector2D.prototype.equals = function(that) {\n return (\n this.x === that.x &&\n this.y === that.y\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Vector2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nVector2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nVector2D.prototype.toString = function() {\n return \"vector(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Vector2D;\n}\n","/**\n * Matrix2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n */\n\nfunction setReadonlyProperty(object, property, value) {\n Object.defineProperty(object, property, {\n value: value,\n writable: false,\n enumerable: true,\n configurable: false\n });\n}\n\n/**\n * Identity matrix\n *\n * @returns {Matrix2D}\n */\nsetReadonlyProperty(Matrix2D, \"IDENTITY\", new Matrix2D(1, 0, 0, 1, 0, 0));\nsetReadonlyProperty(Matrix2D.IDENTITY, \"isIdentity\", function () { return true; });\n\n\n/**\n * Matrix2D\n *\n * [a c e]\n * [b d f]\n * [0 0 1]\n *\n * @param {Number} a\n * @param {Number} b\n * @param {Number} c\n * @param {Number} d\n * @param {Number} e\n * @param {Number} f\n * @returns {Matrix2D}\n */\nfunction Matrix2D(a, b, c, d, e, f) {\n setReadonlyProperty(this, \"a\", (a !== undefined) ? a : 1);\n setReadonlyProperty(this, \"b\", (b !== undefined) ? b : 0);\n setReadonlyProperty(this, \"c\", (c !== undefined) ? c : 0);\n setReadonlyProperty(this, \"d\", (d !== undefined) ? d : 1);\n setReadonlyProperty(this, \"e\", (e !== undefined) ? e : 0);\n setReadonlyProperty(this, \"f\", (f !== undefined) ? f : 0);\n}\n\n\n// *** STATIC METHODS\n\n/**\n * translation\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.translation = function(tx, ty) {\n return new Matrix2D(1, 0, 0, 1, tx, ty);\n};\n\n/**\n * scaling\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.scaling = function(scale) {\n return new Matrix2D(scale, 0, 0, scale, 0, 0);\n};\n\n/**\n * scalingAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.scalingAt = function(scale, center) {\n return new Matrix2D(\n scale,\n 0,\n 0,\n scale,\n center.x - center.x * scale,\n center.y - center.y * scale\n );\n}\n\n\n/**\n * nonUniformScaling\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScaling = function(scaleX, scaleY) {\n return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0);\n};\n\n/**\n * nonUniformScalingAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScalingAt = function(scaleX, scaleY, center) {\n return new Matrix2D(\n scaleX,\n 0,\n 0,\n scaleY,\n center.x - center.x * scaleX,\n center.y - center.y * scaleY\n );\n};\n\n/**\n * rotation\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.rotation = function(radians) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * rotationAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.rotationAt = function(radians, center) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(\n c,\n s,\n -s,\n c,\n center.x - center.x * c + center.y * s,\n center.y - center.y * c - center.x * s\n );\n};\n\n/**\n * rotationFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.rotationFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * xFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.xFlip = function() {\n return new Matrix2D(-1, 0, 0, 1, 0, 0);\n};\n\n/**\n * yFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.yFlip = function() {\n return new Matrix2D(1, 0, 0, -1, 0, 0);\n};\n\n/**\n * xSkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.xSkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, 0, t, 1, 0, 0);\n};\n\n/**\n * ySkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.ySkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, t, 0, 1, 0, 0);\n};\n\n\n// *** METHODS\n\n/**\n * multiply\n *\n * @pararm {Matrix2D} that\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.multiply = function (that) {\n if (this.isIdentity()) {\n return that;\n }\n\n if (that.isIdentity()) {\n return this;\n }\n\n return new this.constructor(\n this.a * that.a + this.c * that.b,\n this.b * that.a + this.d * that.b,\n this.a * that.c + this.c * that.d,\n this.b * that.c + this.d * that.d,\n this.a * that.e + this.c * that.f + this.e,\n this.b * that.e + this.d * that.f + this.f\n );\n};\n\n/**\n * inverse\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.inverse = function () {\n if (this.isIdentity()) {\n return this;\n }\n\n var det1 = this.a * this.d - this.b * this.c;\n\n if ( det1 === 0.0 ) {\n throw(\"Matrix is not invertible\");\n }\n\n var idet = 1.0 / det1;\n var det2 = this.f * this.c - this.e * this.d;\n var det3 = this.e * this.b - this.f * this.a;\n\n return new this.constructor(\n this.d * idet,\n -this.b * idet,\n -this.c * idet,\n this.a * idet,\n det2 * idet,\n det3 * idet\n );\n};\n\n/**\n * translate\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.translate = function(tx, ty) {\n return new this.constructor(\n this.a,\n this.b,\n this.c,\n this.d,\n this.a * tx + this.c * ty + this.e,\n this.b * tx + this.d * ty + this.f\n );\n};\n\n/**\n * scale\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scale = function(scale) {\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleAt = function(scale, center) {\n var dx = center.x - scale * center.x;\n var dy = center.y - scale * center.y;\n\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * scaleNonUniform\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniform = function(scaleX, scaleY) {\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleNonUniformAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniformAt = function(scaleX, scaleY, center) {\n var dx = center.x - scaleX * center.x;\n var dy = center.y - scaleY * center.y;\n\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * rotate\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotate = function(radians) {\n var c = Math.cos(radians);\n var s = Math.sin(radians);\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * rotateAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @result {Matrix2D}\n */\nMatrix2D.prototype.rotateAt = function(radians, center) {\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var cx = center.x;\n var cy = center.y;\n\n var a = this.a * cos + this.c * sin;\n var b = this.b * cos + this.d * sin;\n var c = this.c * cos - this.a * sin;\n var d = this.d * cos - this.b * sin;\n\n return new this.constructor(\n a,\n b,\n c,\n d,\n (this.a - a) * cx + (this.c - c) * cy + this.e,\n (this.b - b) * cx + (this.d - d) * cy + this.f\n );\n};\n\n/**\n * rotateFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotateFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * flipX\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipX = function() {\n return new this.constructor(\n -this.a,\n -this.b,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * flipY\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipY = function() {\n return new this.constructor(\n this.a,\n this.b,\n -this.c,\n -this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * skewX\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewX = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a,\n this.b,\n this.c + this.a * t,\n this.d + this.b * t,\n this.e,\n this.f\n );\n};\n\n// TODO: skewXAt\n\n/**\n * skewY\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewY = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a + this.c * t,\n this.b + this.d * t,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n// TODO: skewYAt\n\n/**\n * isIdentity\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isIdentity = function() {\n return (\n this.a === 1.0 &&\n this.b === 0.0 &&\n this.c === 0.0 &&\n this.d === 1.0 &&\n this.e === 0.0 &&\n this.f === 0.0\n );\n};\n\n/**\n * isInvertible\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isInvertible = function() {\n return this.a * this.d - this.b * this.c !== 0.0;\n};\n\n/**\n * getScale\n *\n * @returns {{ scaleX: Number, scaleY: Number }}\n */\nMatrix2D.prototype.getScale = function() {\n return {\n scaleX: Math.sqrt(this.a * this.a + this.c * this.c),\n scaleY: Math.sqrt(this.b * this.b + this.d * this.d)\n };\n};\n\n/**\n * getDecomposition\n *\n * Calculates matrix Singular Value Decomposition\n *\n * The resulting matrices, translation, rotation, scale, and rotation0, return\n * this matrix when they are muliplied together in the listed order\n *\n * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688}\n * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation}\n *\n * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }}\n */\nMatrix2D.prototype.getDecomposition = function () {\n var E = (this.a + this.d) * 0.5;\n var F = (this.a - this.d) * 0.5;\n var G = (this.b + this.c) * 0.5;\n var H = (this.b - this.c) * 0.5;\n\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n var scaleX = Q + R;\n var scaleY = Q - R;\n\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n var theta = (a2 - a1) * 0.5;\n var phi = (a2 + a1) * 0.5;\n\n // TODO: Add static methods to generate translation, rotation, etc.\n // matrices directly\n\n return {\n translation: new this.constructor(1, 0, 0, 1, this.e, this.f),\n rotation: this.constructor.IDENTITY.rotate(phi),\n scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0),\n rotation0: this.constructor.IDENTITY.rotate(theta)\n };\n};\n\n/**\n * equals\n *\n * @param {Matrix2D} that\n * @returns {Boolean}\n */\nMatrix2D.prototype.equals = function(that) {\n return (\n this.a === that.a &&\n this.b === that.b &&\n this.c === that.c &&\n this.d === that.d &&\n this.e === that.e &&\n this.f === that.f\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Matrix2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nMatrix2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.a - that.a) < precision &&\n Math.abs(this.b - that.b) < precision &&\n Math.abs(this.c - that.c) < precision &&\n Math.abs(this.d - that.d) < precision &&\n Math.abs(this.e - that.e) < precision &&\n Math.abs(this.f - that.f) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nMatrix2D.prototype.toString = function() {\n return \"matrix(\" + [this.a, this.b, this.c, this.d, this.e, this.f].join(\",\") + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Matrix2D;\n}\n","// expose classes\n\nexports.Point2D = require('./lib/Point2D');\nexports.Vector2D = require('./lib/Vector2D');\nexports.Matrix2D = require('./lib/Matrix2D');\n","/**\n *\n * Polynomial.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n * \n * contribution {@link http://github.com/Quazistax/kld-polynomial}\n * @copyright 2015 Robert Benko (Quazistax) \n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n */\nclass Intersection {\n /**\n * @param {string} status\n */\n constructor(status) {\n this.init(status);\n }\n\n\n /**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\n init(status) {\n this.status = status;\n this.points = [];\n }\n\n\n /**\n * appendPoint\n *\n * @param {Point2D} point\n */\n appendPoint(point) {\n this.points.push(point);\n }\n\n\n /**\n * appendPoints\n *\n * @param {Array} points\n */\n appendPoints(points) {\n this.points = this.points.concat(points);\n }\n}\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n */\nclass IntersectionArgs {\n /**\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\n constructor(name, args) {\n this.init(name, args);\n }\n /**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\n init(name, args) {\n this.name = name;\n this.args = args;\n }\n}\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","point","intersect","shape1","shape2","name","intersectPathShape","method","args","apply","path","shape","segment","inter","appendPoints","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","appendPoint","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","IntersectionArgs","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index-umd.js b/dist/index-umd.js index 2b6e13c..e645cb7 100644 --- a/dist/index-umd.js +++ b/dist/index-umd.js @@ -1,4115 +1,4163 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = global || self, factory(global.KldIntersections = {})); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.KldIntersections = {})); }(this, function (exports) { 'use strict'; - function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; - } - - var Point2D_1 = createCommonjsModule(function (module) { - /** - * - * Point2D.js - * - * copyright 2001-2002, 2013, 2017 Kevin Lindsey - * - */ - - /** - * Point2D - * - * @param {Number} x - * @param {Number} y - * @returns {Point2D} - */ - function Point2D(x, y) { - Object.defineProperties(this, { - "x": { - value: x !== undefined ? x : 0.0, - writable: false, - enumerable: true, - configurable: false - }, - "y": { - value: y !== undefined ? y : 0.0, - writable: false, - enumerable: true, - configurable: false - } - }); - } - /** - * clone - * - * @returns {Point2D} - */ - - - Point2D.prototype.clone = function () { - return new this.constructor(this.x, this.y); - }; - /** - * add - * - * @param {Point2D|Vector2D} that - * @returns {Point2D} - */ - - - Point2D.prototype.add = function (that) { - return new this.constructor(this.x + that.x, this.y + that.y); - }; - /** - * subtract - * - * @param { Vector2D | Point2D } that - * @returns {Point2D} - */ - - - Point2D.prototype.subtract = function (that) { - return new this.constructor(this.x - that.x, this.y - that.y); - }; - /** - * multiply - * - * @param {Number} scalar - * @returns {Point2D} - */ - - - Point2D.prototype.multiply = function (scalar) { - return new this.constructor(this.x * scalar, this.y * scalar); - }; - /** - * divide - * - * @param {Number} scalar - * @returns {Point2D} - */ - - - Point2D.prototype.divide = function (scalar) { - return new this.constructor(this.x / scalar, this.y / scalar); - }; - /** - * equals - * - * @param {Point2D} that - * @returns {Boolean} - */ - - - Point2D.prototype.equals = function (that) { - return this.x === that.x && this.y === that.y; - }; - /** - * precisionEquals - * - * @param {Point2D} that - * @param {Number} precision - * @returns {Boolean} - */ - - - Point2D.prototype.precisionEquals = function (that, precision) { - return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; - }; // utility methods - - /** - * lerp - * - * @param { Vector2D | Point2D } that - * @param {Number} t - @ @returns {Point2D} - */ - - - Point2D.prototype.lerp = function (that, t) { - var omt = 1.0 - t; - return new this.constructor(this.x * omt + that.x * t, this.y * omt + that.y * t); - }; - /** - * distanceFrom - * - * @param {Point2D} that - * @returns {Number} - */ - - - Point2D.prototype.distanceFrom = function (that) { - var dx = this.x - that.x; - var dy = this.y - that.y; - return Math.sqrt(dx * dx + dy * dy); - }; - /** - * min - * - * @param {Point2D} that - * @returns {Number} - */ - - - Point2D.prototype.min = function (that) { - return new this.constructor(Math.min(this.x, that.x), Math.min(this.y, that.y)); - }; - /** - * max - * - * @param {Point2D} that - * @returns {Number} - */ - - - Point2D.prototype.max = function (that) { - return new this.constructor(Math.max(this.x, that.x), Math.max(this.y, that.y)); - }; - /** - * transform - * - * @param {Matrix2D} - * @result {Point2D} - */ - - - Point2D.prototype.transform = function (matrix) { - return new this.constructor(matrix.a * this.x + matrix.c * this.y + matrix.e, matrix.b * this.x + matrix.d * this.y + matrix.f); - }; - /** - * toString - * - * @returns {String} - */ - - - Point2D.prototype.toString = function () { - return "point(" + this.x + "," + this.y + ")"; - }; - - { - module.exports = Point2D; - } - }); - - var Vector2D_1 = createCommonjsModule(function (module) { - /** - * - * Vector2D.js - * - * copyright 2001-2002, 2013, 2017 Kevin Lindsey - * - */ - - /** - * Vector2D - * - * @param {Number} x - * @param {Number} y - * @returns {Vector2D} - */ - function Vector2D(x, y) { - Object.defineProperties(this, { - "x": { - value: x !== undefined ? x : 0.0, - writable: false, - enumerable: true, - configurable: false - }, - "y": { - value: y !== undefined ? y : 0.0, - writable: false, - enumerable: true, - configurable: false - } - }); - } - /** - * fromPoints - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @returns {Vector2D} - */ - - - Vector2D.fromPoints = function (p1, p2) { - return new Vector2D(p2.x - p1.x, p2.y - p1.y); - }; - /** - * length - * - * @returns {Number} - */ - - - Vector2D.prototype.length = function () { - return Math.sqrt(this.x * this.x + this.y * this.y); - }; - /** - * magnitude - * - * @returns {Number} - */ - - - Vector2D.prototype.magnitude = function () { - return this.x * this.x + this.y * this.y; - }; - /** - * dot - * - * @param {Vector2D} that - * @returns {Number} - */ - - - Vector2D.prototype.dot = function (that) { - return this.x * that.x + this.y * that.y; - }; - /** - * cross - * - * @param {Vector2D} that - * @returns {Number} - */ - - - Vector2D.prototype.cross = function (that) { - return this.x * that.y - this.y * that.x; - }; - /** - * determinant - * - * @param {Vector2D} that - * @returns {Number} - */ - - - Vector2D.prototype.determinant = function (that) { - return this.x * that.y - this.y * that.x; - }; - /** - * unit - * - * @returns {Vector2D} - */ - - - Vector2D.prototype.unit = function () { - return this.divide(this.length()); - }; - /** - * add - * - * @param {Vector2D} that - * @returns {Vector2D} - */ - - - Vector2D.prototype.add = function (that) { - return new this.constructor(this.x + that.x, this.y + that.y); - }; - /** - * subtract - * - * @param {Vector2D} that - * @returns {Vector2D} - */ - - - Vector2D.prototype.subtract = function (that) { - return new this.constructor(this.x - that.x, this.y - that.y); - }; - /** - * multiply - * - * @param {Number} scalar - * @returns {Vector2D} - */ - - - Vector2D.prototype.multiply = function (scalar) { - return new this.constructor(this.x * scalar, this.y * scalar); - }; - /** - * divide - * - * @param {Number} scalar - * @returns {Vector2D} - */ - - - Vector2D.prototype.divide = function (scalar) { - return new this.constructor(this.x / scalar, this.y / scalar); - }; - /** - * angleBetween - * - * @param {Vector2D} that - * @returns {Number} - */ - - - Vector2D.prototype.angleBetween = function (that) { - var cos = this.dot(that) / (this.length() * that.length()); - cos = Math.max(-1, Math.min(cos, 1)); - var radians = Math.acos(cos); - return this.cross(that) < 0.0 ? -radians : radians; - }; - /** - * Find a vector is that is perpendicular to this vector - * - * @returns {Vector2D} - */ - - - Vector2D.prototype.perp = function () { - return new this.constructor(-this.y, this.x); - }; - /** - * Find the component of the specified vector that is perpendicular to - * this vector - * - * @param {Vector2D} that - * @returns {Vector2D} - */ - - - Vector2D.prototype.perpendicular = function (that) { - return this.subtract(this.project(that)); - }; - /** - * project - * - * @param {Vector2D} that - * @returns {Vector2D} - */ - - - Vector2D.prototype.project = function (that) { - var percent = this.dot(that) / that.dot(that); - return that.multiply(percent); - }; - /** - * transform - * - * @param {Matrix2D} - * @returns {Vector2D} - */ - - - Vector2D.prototype.transform = function (matrix) { - return new this.constructor(matrix.a * this.x + matrix.c * this.y, matrix.b * this.x + matrix.d * this.y); - }; - /** - * equals - * - * @param {Vector2D} that - * @returns {Boolean} - */ - - - Vector2D.prototype.equals = function (that) { - return this.x === that.x && this.y === that.y; - }; - /** - * precisionEquals - * - * @param {Vector2D} that - * @param {Number} precision - * @returns {Boolean} - */ - - - Vector2D.prototype.precisionEquals = function (that, precision) { - return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; - }; - /** - * toString - * - * @returns {String} - */ - - - Vector2D.prototype.toString = function () { - return "vector(" + this.x + "," + this.y + ")"; - }; - - { - module.exports = Vector2D; - } - }); - - var Matrix2D_1 = createCommonjsModule(function (module) { - /** - * Matrix2D.js - * - * copyright 2001-2002, 2013, 2017 Kevin Lindsey - */ - function setReadonlyProperty(object, property, value) { - Object.defineProperty(object, property, { - value: value, - writable: false, - enumerable: true, - configurable: false - }); - } - /** - * Identity matrix - * - * @returns {Matrix2D} - */ - - - setReadonlyProperty(Matrix2D, "IDENTITY", new Matrix2D(1, 0, 0, 1, 0, 0)); - setReadonlyProperty(Matrix2D.IDENTITY, "isIdentity", function () { - return true; - }); - /** - * Matrix2D - * - * [a c e] - * [b d f] - * [0 0 1] - * - * @param {Number} a - * @param {Number} b - * @param {Number} c - * @param {Number} d - * @param {Number} e - * @param {Number} f - * @returns {Matrix2D} - */ - - function Matrix2D(a, b, c, d, e, f) { - setReadonlyProperty(this, "a", a !== undefined ? a : 1); - setReadonlyProperty(this, "b", b !== undefined ? b : 0); - setReadonlyProperty(this, "c", c !== undefined ? c : 0); - setReadonlyProperty(this, "d", d !== undefined ? d : 1); - setReadonlyProperty(this, "e", e !== undefined ? e : 0); - setReadonlyProperty(this, "f", f !== undefined ? f : 0); - } // *** STATIC METHODS - - /** - * translation - * - * @param {Number} tx - * @param {Number} ty - * @returns {Matrix2D} - */ - - - Matrix2D.translation = function (tx, ty) { - return new Matrix2D(1, 0, 0, 1, tx, ty); - }; - /** - * scaling - * - * @param {Number} scale - * @returns {Matrix2D} - */ - - - Matrix2D.scaling = function (scale) { - return new Matrix2D(scale, 0, 0, scale, 0, 0); - }; - /** - * scalingAt - * - * @param {Number} scale - * @param {Point2D} center - * @returns {Matrix2D} - */ - - - Matrix2D.scalingAt = function (scale, center) { - return new Matrix2D(scale, 0, 0, scale, center.x - center.x * scale, center.y - center.y * scale); - }; - /** - * nonUniformScaling - * - * @param {Number} scaleX - * @param {Number} scaleY - * @returns {Matrix2D} - */ - - - Matrix2D.nonUniformScaling = function (scaleX, scaleY) { - return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0); - }; - /** - * nonUniformScalingAt - * - * @param {Number} scaleX - * @param {Number} scaleY - * @param {Point2D} center - * @returns {Matrix2D} - */ - - - Matrix2D.nonUniformScalingAt = function (scaleX, scaleY, center) { - return new Matrix2D(scaleX, 0, 0, scaleY, center.x - center.x * scaleX, center.y - center.y * scaleY); - }; - /** - * rotation - * - * @param {Number} radians - * @returns {Matrix2D} - */ - - - Matrix2D.rotation = function (radians) { - var c = Math.cos(radians); - var s = Math.sin(radians); - return new Matrix2D(c, s, -s, c, 0, 0); - }; - /** - * rotationAt - * - * @param {Number} radians - * @param {Point2D} center - * @returns {Matrix2D} - */ - - - Matrix2D.rotationAt = function (radians, center) { - var c = Math.cos(radians); - var s = Math.sin(radians); - return new Matrix2D(c, s, -s, c, center.x - center.x * c + center.y * s, center.y - center.y * c - center.x * s); - }; - /** - * rotationFromVector - * - * @param {Vector2D} - * @returns {Matrix2D} - */ - - - Matrix2D.rotationFromVector = function (vector) { - var unit = vector.unit(); - var c = unit.x; // cos - - var s = unit.y; // sin - - return new Matrix2D(c, s, -s, c, 0, 0); - }; - /** - * xFlip - * - * @returns {Matrix2D} - */ - - - Matrix2D.xFlip = function () { - return new Matrix2D(-1, 0, 0, 1, 0, 0); - }; - /** - * yFlip - * - * @returns {Matrix2D} - */ - - - Matrix2D.yFlip = function () { - return new Matrix2D(1, 0, 0, -1, 0, 0); - }; - /** - * xSkew - * - * @param {Number} radians - * @returns {Matrix2D} - */ - - - Matrix2D.xSkew = function (radians) { - var t = Math.tan(radians); - return new Matrix2D(1, 0, t, 1, 0, 0); - }; - /** - * ySkew - * - * @param {Number} radians - * @returns {Matrix2D} - */ - - - Matrix2D.ySkew = function (radians) { - var t = Math.tan(radians); - return new Matrix2D(1, t, 0, 1, 0, 0); - }; // *** METHODS - - /** - * multiply - * - * @pararm {Matrix2D} that - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.multiply = function (that) { - if (this.isIdentity()) { - return that; - } - - if (that.isIdentity()) { - return this; - } - - return new this.constructor(this.a * that.a + this.c * that.b, this.b * that.a + this.d * that.b, this.a * that.c + this.c * that.d, this.b * that.c + this.d * that.d, this.a * that.e + this.c * that.f + this.e, this.b * that.e + this.d * that.f + this.f); - }; - /** - * inverse - * - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.inverse = function () { - if (this.isIdentity()) { - return this; - } - - var det1 = this.a * this.d - this.b * this.c; - - if (det1 === 0.0) { - throw "Matrix is not invertible"; - } - - var idet = 1.0 / det1; - var det2 = this.f * this.c - this.e * this.d; - var det3 = this.e * this.b - this.f * this.a; - return new this.constructor(this.d * idet, -this.b * idet, -this.c * idet, this.a * idet, det2 * idet, det3 * idet); - }; - /** - * translate - * - * @param {Number} tx - * @param {Number} ty - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.translate = function (tx, ty) { - return new this.constructor(this.a, this.b, this.c, this.d, this.a * tx + this.c * ty + this.e, this.b * tx + this.d * ty + this.f); - }; - /** - * scale - * - * @param {Number} scale - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.scale = function (scale) { - return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.e, this.f); - }; - /** - * scaleAt - * - * @param {Number} scale - * @param {Point2D} center - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.scaleAt = function (scale, center) { - var dx = center.x - scale * center.x; - var dy = center.y - scale * center.y; - return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); - }; - /** - * scaleNonUniform - * - * @param {Number} scaleX - * @param {Number} scaleY - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.scaleNonUniform = function (scaleX, scaleY) { - return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.e, this.f); - }; - /** - * scaleNonUniformAt - * - * @param {Number} scaleX - * @param {Number} scaleY - * @param {Point2D} center - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.scaleNonUniformAt = function (scaleX, scaleY, center) { - var dx = center.x - scaleX * center.x; - var dy = center.y - scaleY * center.y; - return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); - }; - /** - * rotate - * - * @param {Number} radians - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.rotate = function (radians) { - var c = Math.cos(radians); - var s = Math.sin(radians); - return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); - }; - /** - * rotateAt - * - * @param {Number} radians - * @param {Point2D} center - * @result {Matrix2D} - */ - - - Matrix2D.prototype.rotateAt = function (radians, center) { - var cos = Math.cos(radians); - var sin = Math.sin(radians); - var cx = center.x; - var cy = center.y; - var a = this.a * cos + this.c * sin; - var b = this.b * cos + this.d * sin; - var c = this.c * cos - this.a * sin; - var d = this.d * cos - this.b * sin; - return new this.constructor(a, b, c, d, (this.a - a) * cx + (this.c - c) * cy + this.e, (this.b - b) * cx + (this.d - d) * cy + this.f); - }; - /** - * rotateFromVector - * - * @param {Vector2D} - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.rotateFromVector = function (vector) { - var unit = vector.unit(); - var c = unit.x; // cos - - var s = unit.y; // sin - - return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); - }; - /** - * flipX - * - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.flipX = function () { - return new this.constructor(-this.a, -this.b, this.c, this.d, this.e, this.f); - }; - /** - * flipY - * - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.flipY = function () { - return new this.constructor(this.a, this.b, -this.c, -this.d, this.e, this.f); - }; - /** - * skewX - * - * @pararm {Number} radians - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.skewX = function (radians) { - var t = Math.tan(radians); - return new this.constructor(this.a, this.b, this.c + this.a * t, this.d + this.b * t, this.e, this.f); - }; // TODO: skewXAt - - /** - * skewY - * - * @pararm {Number} radians - * @returns {Matrix2D} - */ - - - Matrix2D.prototype.skewY = function (radians) { - var t = Math.tan(radians); - return new this.constructor(this.a + this.c * t, this.b + this.d * t, this.c, this.d, this.e, this.f); - }; // TODO: skewYAt - - /** - * isIdentity - * - * @returns {Boolean} - */ - - - Matrix2D.prototype.isIdentity = function () { - return this.a === 1.0 && this.b === 0.0 && this.c === 0.0 && this.d === 1.0 && this.e === 0.0 && this.f === 0.0; - }; - /** - * isInvertible - * - * @returns {Boolean} - */ - - - Matrix2D.prototype.isInvertible = function () { - return this.a * this.d - this.b * this.c !== 0.0; - }; - /** - * getScale - * - * @returns {{ scaleX: Number, scaleY: Number }} - */ - - - Matrix2D.prototype.getScale = function () { - return { - scaleX: Math.sqrt(this.a * this.a + this.c * this.c), - scaleY: Math.sqrt(this.b * this.b + this.d * this.d) - }; - }; - /** - * getDecomposition - * - * Calculates matrix Singular Value Decomposition - * - * The resulting matrices, translation, rotation, scale, and rotation0, return - * this matrix when they are muliplied together in the listed order - * - * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688} - * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation} - * - * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }} - */ - - - Matrix2D.prototype.getDecomposition = function () { - var E = (this.a + this.d) * 0.5; - var F = (this.a - this.d) * 0.5; - var G = (this.b + this.c) * 0.5; - var H = (this.b - this.c) * 0.5; - var Q = Math.sqrt(E * E + H * H); - var R = Math.sqrt(F * F + G * G); - var scaleX = Q + R; - var scaleY = Q - R; - var a1 = Math.atan2(G, F); - var a2 = Math.atan2(H, E); - var theta = (a2 - a1) * 0.5; - var phi = (a2 + a1) * 0.5; // TODO: Add static methods to generate translation, rotation, etc. - // matrices directly - - return { - translation: new this.constructor(1, 0, 0, 1, this.e, this.f), - rotation: this.constructor.IDENTITY.rotate(phi), - scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0), - rotation0: this.constructor.IDENTITY.rotate(theta) - }; - }; - /** - * equals - * - * @param {Matrix2D} that - * @returns {Boolean} - */ - - - Matrix2D.prototype.equals = function (that) { - return this.a === that.a && this.b === that.b && this.c === that.c && this.d === that.d && this.e === that.e && this.f === that.f; - }; - /** - * precisionEquals - * - * @param {Matrix2D} that - * @param {Number} precision - * @returns {Boolean} - */ - - - Matrix2D.prototype.precisionEquals = function (that, precision) { - return Math.abs(this.a - that.a) < precision && Math.abs(this.b - that.b) < precision && Math.abs(this.c - that.c) < precision && Math.abs(this.d - that.d) < precision && Math.abs(this.e - that.e) < precision && Math.abs(this.f - that.f) < precision; - }; - /** - * toString - * - * @returns {String} - */ - - - Matrix2D.prototype.toString = function () { - return "matrix(" + [this.a, this.b, this.c, this.d, this.e, this.f].join(",") + ")"; - }; - - { - module.exports = Matrix2D; - } - }); - - // expose classes - var Point2D = Point2D_1; - var Vector2D = Vector2D_1; - var Matrix2D = Matrix2D_1; - - var Polynomial_1 = createCommonjsModule(function (module) { - /** - * - * Polynomial.js - * - * copyright 2002, 2013 Kevin Lindsey - * - * contribution {@link http://github.com/Quazistax/kld-polynomial} - * @copyright 2015 Robert Benko (Quazistax) - * @license MIT - */ - Polynomial.TOLERANCE = 1e-6; - Polynomial.ACCURACY = 15; - /** - * interpolate - * - * Based on poloint in "Numerical Recipes in C, 2nd Edition", pages 109-110 - * - * @param {Array} xs - * @param {Array} ys - * @param {Number} n - * @param {Number} offset - * @param {Number} x - * - * @returns {{y: Number, dy: Number}} - */ - - Polynomial.interpolate = function (xs, ys, n, offset, x) { - if (xs.constructor !== Array || ys.constructor !== Array) { - throw new Error("Polynomial.interpolate: xs and ys must be arrays"); - } - - if (isNaN(n) || isNaN(offset) || isNaN(x)) { - throw new Error("Polynomial.interpolate: n, offset, and x must be numbers"); - } - - var y = 0; - var dy = 0; - var c = new Array(n); - var d = new Array(n); - var ns = 0; - var diff = Math.abs(x - xs[offset]); - - for (var i = 0; i < n; i++) { - var dift = Math.abs(x - xs[offset + i]); - - if (dift < diff) { - ns = i; - diff = dift; - } - - c[i] = d[i] = ys[offset + i]; - } - - y = ys[offset + ns]; - ns--; - - for (var m = 1; m < n; m++) { - for (var i = 0; i < n - m; i++) { - var ho = xs[offset + i] - x; - var hp = xs[offset + i + m] - x; - var w = c[i + 1] - d[i]; - var den = ho - hp; - - if (den == 0.0) { - throw new Error("Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)"); - } - - den = w / den; - d[i] = hp * den; - c[i] = ho * den; - } - - dy = 2 * (ns + 1) < n - m ? c[ns + 1] : d[ns--]; - y += dy; - } - - return { - y: y, - dy: dy - }; - }; - /** - * Polynomial - * - * @returns {Polynomial} - */ - - - function Polynomial() { - this.init(arguments); - } - /** - * init - */ - - - Polynomial.prototype.init = function (coefs) { - this.coefs = new Array(); - - for (var i = coefs.length - 1; i >= 0; i--) { - this.coefs.push(coefs[i]); - } - - this._variable = "t"; - this._s = 0; - }; - /** - * eval - */ - - - Polynomial.prototype.eval = function (x) { - if (isNaN(x)) { - throw new Error("Polynomial.eval: parameter must be a number"); - } - - var result = 0; - - for (var i = this.coefs.length - 1; i >= 0; i--) { - result = result * x + this.coefs[i]; - } - - return result; - }; - /** - * add - */ - - - Polynomial.prototype.add = function (that) { - var result = new Polynomial(); - var d1 = this.getDegree(); - var d2 = that.getDegree(); - var dmax = Math.max(d1, d2); - - for (var i = 0; i <= dmax; i++) { - var v1 = i <= d1 ? this.coefs[i] : 0; - var v2 = i <= d2 ? that.coefs[i] : 0; - result.coefs[i] = v1 + v2; - } - - return result; - }; - /** - * multiply - */ - - - Polynomial.prototype.multiply = function (that) { - var result = new Polynomial(); - - for (var i = 0; i <= this.getDegree() + that.getDegree(); i++) { - result.coefs.push(0); - } - - for (var i = 0; i <= this.getDegree(); i++) { - for (var j = 0; j <= that.getDegree(); j++) { - result.coefs[i + j] += this.coefs[i] * that.coefs[j]; - } - } - - return result; - }; - /** - * divide_scalar - */ - - - Polynomial.prototype.divide_scalar = function (scalar) { - for (var i = 0; i < this.coefs.length; i++) { - this.coefs[i] /= scalar; - } - }; - /** - * simplify - */ - - - Polynomial.prototype.simplify = function (TOLERANCE) { - if (TOLERANCE === undefined) TOLERANCE = 1e-12; - - for (var i = this.getDegree(); i >= 0; i--) { - if (Math.abs(this.coefs[i]) <= TOLERANCE) { - this.coefs.pop(); - } else { - break; - } - } - }; - /** - * bisection - */ - - - Polynomial.prototype.bisection = function (min, max) { - var minValue = this.eval(min); - var maxValue = this.eval(max); - var result; - - if (Math.abs(minValue) <= Polynomial.TOLERANCE) { - result = min; - } else if (Math.abs(maxValue) <= Polynomial.TOLERANCE) { - result = max; - } else if (minValue * maxValue <= 0) { - var tmp1 = Math.log(max - min); - var tmp2 = Math.LN10 * Polynomial.ACCURACY; - var iters = Math.ceil((tmp1 + tmp2) / Math.LN2); - - for (var i = 0; i < iters; i++) { - result = 0.5 * (min + max); - var value = this.eval(result); - - if (Math.abs(value) <= Polynomial.TOLERANCE) { - break; - } - - if (value * minValue < 0) { - max = result; - maxValue = value; - } else { - min = result; - minValue = value; - } - } - } - - return result; - }; - /** - * toString - */ - - - Polynomial.prototype.toString = function () { - var coefs = new Array(); - var signs = new Array(); - - for (var i = this.coefs.length - 1; i >= 0; i--) { - var value = Math.round(this.coefs[i] * 1000) / 1000; //var value = this.coefs[i]; - - if (value != 0) { - var sign = value < 0 ? " - " : " + "; - value = Math.abs(value); - - if (i > 0) { - if (value == 1) { - value = this._variable; - } else { - value += this._variable; - } - } - - if (i > 1) { - value += "^" + i; - } - - signs.push(sign); - coefs.push(value); - } - } - - signs[0] = signs[0] == " + " ? "" : "-"; - var result = ""; - - for (var i = 0; i < coefs.length; i++) { - result += signs[i] + coefs[i]; - } - - return result; - }; - /** - * trapezoid - * - * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 137 - */ - - - Polynomial.prototype.trapezoid = function (min, max, n) { - if (isNaN(min) || isNaN(max) || isNaN(n)) { - throw new Error("Polynomial.trapezoid: parameters must be numbers"); - } - - var range = max - min; - - if (n == 1) { - var minValue = this.eval(min); - var maxValue = this.eval(max); - this._s = 0.5 * range * (minValue + maxValue); - } else { - var it = 1 << n - 2; - var delta = range / it; - var x = min + 0.5 * delta; - var sum = 0; - - for (var i = 0; i < it; i++) { - sum += this.eval(x); - x += delta; - } - - this._s = 0.5 * (this._s + range * sum / it); - } - - if (isNaN(this._s)) { - throw new Error("Polynomial.trapezoid: this._s is NaN"); - } - - return this._s; - }; - /** - * simpson - * - * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 139 - */ - - - Polynomial.prototype.simpson = function (min, max) { - if (isNaN(min) || isNaN(max)) { - throw new Error("Polynomial.simpson: parameters must be numbers"); - } - - var range = max - min; - var st = 0.5 * range * (this.eval(min) + this.eval(max)); - var t = st; - var s = 4.0 * st / 3.0; - var os = s; - var ost = st; - var TOLERANCE = 1e-7; - var it = 1; - - for (var n = 2; n <= 20; n++) { - var delta = range / it; - var x = min + 0.5 * delta; - var sum = 0; - - for (var i = 1; i <= it; i++) { - sum += this.eval(x); - x += delta; - } - - t = 0.5 * (t + range * sum / it); - st = t; - s = (4.0 * st - ost) / 3.0; - - if (Math.abs(s - os) < TOLERANCE * Math.abs(os)) { - break; - } - - os = s; - ost = st; - it <<= 1; - } - - return s; - }; - /** - * romberg - */ - - - Polynomial.prototype.romberg = function (min, max) { - if (isNaN(min) || isNaN(max)) { - throw new Error("Polynomial.romberg: parameters must be numbers"); - } - - var MAX = 20; - var K = 3; - var TOLERANCE = 1e-6; - var s = new Array(MAX + 1); - var h = new Array(MAX + 1); - var result = { - y: 0, - dy: 0 - }; - h[0] = 1.0; - - for (var j = 1; j <= MAX; j++) { - s[j - 1] = this.trapezoid(min, max, j); - - if (j >= K) { - result = Polynomial.interpolate(h, s, K, j - K, 0.0); - if (Math.abs(result.dy) <= TOLERANCE * result.y) break; - } - - s[j] = s[j - 1]; - h[j] = 0.25 * h[j - 1]; - } - - return result.y; - }; // getters and setters - - /** - * get degree - */ - - - Polynomial.prototype.getDegree = function () { - return this.coefs.length - 1; - }; - /** - * getDerivative - */ - - - Polynomial.prototype.getDerivative = function () { - var derivative = new Polynomial(); - - for (var i = 1; i < this.coefs.length; i++) { - derivative.coefs.push(i * this.coefs[i]); - } - - return derivative; - }; - /** - * getRoots - */ - - - Polynomial.prototype.getRoots = function () { - var result; - this.simplify(); - - switch (this.getDegree()) { - case 0: - result = []; - break; + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var Point2D_1 = createCommonjsModule(function (module) { + /** + * + * Point2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + * + */ + + /** + * Point2D + * + * @param {Number} x + * @param {Number} y + * @returns {Point2D} + */ + function Point2D(x, y) { + Object.defineProperties(this, { + "x": { + value: x !== undefined ? x : 0.0, + writable: false, + enumerable: true, + configurable: false + }, + "y": { + value: y !== undefined ? y : 0.0, + writable: false, + enumerable: true, + configurable: false + } + }); + } + /** + * clone + * + * @returns {Point2D} + */ + + + Point2D.prototype.clone = function () { + return new this.constructor(this.x, this.y); + }; + /** + * add + * + * @param {Point2D|Vector2D} that + * @returns {Point2D} + */ + + + Point2D.prototype.add = function (that) { + return new this.constructor(this.x + that.x, this.y + that.y); + }; + /** + * subtract + * + * @param { Vector2D | Point2D } that + * @returns {Point2D} + */ + + + Point2D.prototype.subtract = function (that) { + return new this.constructor(this.x - that.x, this.y - that.y); + }; + /** + * multiply + * + * @param {Number} scalar + * @returns {Point2D} + */ + + + Point2D.prototype.multiply = function (scalar) { + return new this.constructor(this.x * scalar, this.y * scalar); + }; + /** + * divide + * + * @param {Number} scalar + * @returns {Point2D} + */ + + + Point2D.prototype.divide = function (scalar) { + return new this.constructor(this.x / scalar, this.y / scalar); + }; + /** + * equals + * + * @param {Point2D} that + * @returns {Boolean} + */ + + + Point2D.prototype.equals = function (that) { + return this.x === that.x && this.y === that.y; + }; + /** + * precisionEquals + * + * @param {Point2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + + Point2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; + }; // utility methods + + /** + * lerp + * + * @param { Vector2D | Point2D } that + * @param {Number} t + @ @returns {Point2D} + */ + + + Point2D.prototype.lerp = function (that, t) { + var omt = 1.0 - t; + return new this.constructor(this.x * omt + that.x * t, this.y * omt + that.y * t); + }; + /** + * distanceFrom + * + * @param {Point2D} that + * @returns {Number} + */ + + + Point2D.prototype.distanceFrom = function (that) { + var dx = this.x - that.x; + var dy = this.y - that.y; + return Math.sqrt(dx * dx + dy * dy); + }; + /** + * min + * + * @param {Point2D} that + * @returns {Number} + */ + + + Point2D.prototype.min = function (that) { + return new this.constructor(Math.min(this.x, that.x), Math.min(this.y, that.y)); + }; + /** + * max + * + * @param {Point2D} that + * @returns {Number} + */ + + + Point2D.prototype.max = function (that) { + return new this.constructor(Math.max(this.x, that.x), Math.max(this.y, that.y)); + }; + /** + * transform + * + * @param {Matrix2D} + * @result {Point2D} + */ + + + Point2D.prototype.transform = function (matrix) { + return new this.constructor(matrix.a * this.x + matrix.c * this.y + matrix.e, matrix.b * this.x + matrix.d * this.y + matrix.f); + }; + /** + * toString + * + * @returns {String} + */ + + + Point2D.prototype.toString = function () { + return "point(" + this.x + "," + this.y + ")"; + }; + + { + module.exports = Point2D; + } + }); + + var Vector2D_1 = createCommonjsModule(function (module) { + /** + * + * Vector2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + * + */ + + /** + * Vector2D + * + * @param {Number} x + * @param {Number} y + * @returns {Vector2D} + */ + function Vector2D(x, y) { + Object.defineProperties(this, { + "x": { + value: x !== undefined ? x : 0.0, + writable: false, + enumerable: true, + configurable: false + }, + "y": { + value: y !== undefined ? y : 0.0, + writable: false, + enumerable: true, + configurable: false + } + }); + } + /** + * fromPoints + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @returns {Vector2D} + */ + + + Vector2D.fromPoints = function (p1, p2) { + return new Vector2D(p2.x - p1.x, p2.y - p1.y); + }; + /** + * length + * + * @returns {Number} + */ + + + Vector2D.prototype.length = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + /** + * magnitude + * + * @returns {Number} + */ + + + Vector2D.prototype.magnitude = function () { + return this.x * this.x + this.y * this.y; + }; + /** + * dot + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.dot = function (that) { + return this.x * that.x + this.y * that.y; + }; + /** + * cross + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.cross = function (that) { + return this.x * that.y - this.y * that.x; + }; + /** + * determinant + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.determinant = function (that) { + return this.x * that.y - this.y * that.x; + }; + /** + * unit + * + * @returns {Vector2D} + */ + + + Vector2D.prototype.unit = function () { + return this.divide(this.length()); + }; + /** + * add + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.add = function (that) { + return new this.constructor(this.x + that.x, this.y + that.y); + }; + /** + * subtract + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.subtract = function (that) { + return new this.constructor(this.x - that.x, this.y - that.y); + }; + /** + * multiply + * + * @param {Number} scalar + * @returns {Vector2D} + */ + + + Vector2D.prototype.multiply = function (scalar) { + return new this.constructor(this.x * scalar, this.y * scalar); + }; + /** + * divide + * + * @param {Number} scalar + * @returns {Vector2D} + */ + + + Vector2D.prototype.divide = function (scalar) { + return new this.constructor(this.x / scalar, this.y / scalar); + }; + /** + * angleBetween + * + * @param {Vector2D} that + * @returns {Number} + */ + + + Vector2D.prototype.angleBetween = function (that) { + var cos = this.dot(that) / (this.length() * that.length()); + cos = Math.max(-1, Math.min(cos, 1)); + var radians = Math.acos(cos); + return this.cross(that) < 0.0 ? -radians : radians; + }; + /** + * Find a vector is that is perpendicular to this vector + * + * @returns {Vector2D} + */ + + + Vector2D.prototype.perp = function () { + return new this.constructor(-this.y, this.x); + }; + /** + * Find the component of the specified vector that is perpendicular to + * this vector + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.perpendicular = function (that) { + return this.subtract(this.project(that)); + }; + /** + * project + * + * @param {Vector2D} that + * @returns {Vector2D} + */ + + + Vector2D.prototype.project = function (that) { + var percent = this.dot(that) / that.dot(that); + return that.multiply(percent); + }; + /** + * transform + * + * @param {Matrix2D} + * @returns {Vector2D} + */ + + + Vector2D.prototype.transform = function (matrix) { + return new this.constructor(matrix.a * this.x + matrix.c * this.y, matrix.b * this.x + matrix.d * this.y); + }; + /** + * equals + * + * @param {Vector2D} that + * @returns {Boolean} + */ + + + Vector2D.prototype.equals = function (that) { + return this.x === that.x && this.y === that.y; + }; + /** + * precisionEquals + * + * @param {Vector2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + + Vector2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.x - that.x) < precision && Math.abs(this.y - that.y) < precision; + }; + /** + * toString + * + * @returns {String} + */ + + + Vector2D.prototype.toString = function () { + return "vector(" + this.x + "," + this.y + ")"; + }; + + { + module.exports = Vector2D; + } + }); + + var Matrix2D_1 = createCommonjsModule(function (module) { + /** + * Matrix2D.js + * + * copyright 2001-2002, 2013, 2017 Kevin Lindsey + */ + function setReadonlyProperty(object, property, value) { + Object.defineProperty(object, property, { + value: value, + writable: false, + enumerable: true, + configurable: false + }); + } + /** + * Identity matrix + * + * @returns {Matrix2D} + */ + + + setReadonlyProperty(Matrix2D, "IDENTITY", new Matrix2D(1, 0, 0, 1, 0, 0)); + setReadonlyProperty(Matrix2D.IDENTITY, "isIdentity", function () { + return true; + }); + /** + * Matrix2D + * + * [a c e] + * [b d f] + * [0 0 1] + * + * @param {Number} a + * @param {Number} b + * @param {Number} c + * @param {Number} d + * @param {Number} e + * @param {Number} f + * @returns {Matrix2D} + */ + + function Matrix2D(a, b, c, d, e, f) { + setReadonlyProperty(this, "a", a !== undefined ? a : 1); + setReadonlyProperty(this, "b", b !== undefined ? b : 0); + setReadonlyProperty(this, "c", c !== undefined ? c : 0); + setReadonlyProperty(this, "d", d !== undefined ? d : 1); + setReadonlyProperty(this, "e", e !== undefined ? e : 0); + setReadonlyProperty(this, "f", f !== undefined ? f : 0); + } // *** STATIC METHODS + + /** + * translation + * + * @param {Number} tx + * @param {Number} ty + * @returns {Matrix2D} + */ + + + Matrix2D.translation = function (tx, ty) { + return new Matrix2D(1, 0, 0, 1, tx, ty); + }; + /** + * scaling + * + * @param {Number} scale + * @returns {Matrix2D} + */ + + + Matrix2D.scaling = function (scale) { + return new Matrix2D(scale, 0, 0, scale, 0, 0); + }; + /** + * scalingAt + * + * @param {Number} scale + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.scalingAt = function (scale, center) { + return new Matrix2D(scale, 0, 0, scale, center.x - center.x * scale, center.y - center.y * scale); + }; + /** + * nonUniformScaling + * + * @param {Number} scaleX + * @param {Number} scaleY + * @returns {Matrix2D} + */ + + + Matrix2D.nonUniformScaling = function (scaleX, scaleY) { + return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0); + }; + /** + * nonUniformScalingAt + * + * @param {Number} scaleX + * @param {Number} scaleY + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.nonUniformScalingAt = function (scaleX, scaleY, center) { + return new Matrix2D(scaleX, 0, 0, scaleY, center.x - center.x * scaleX, center.y - center.y * scaleY); + }; + /** + * rotation + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.rotation = function (radians) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new Matrix2D(c, s, -s, c, 0, 0); + }; + /** + * rotationAt + * + * @param {Number} radians + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.rotationAt = function (radians, center) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new Matrix2D(c, s, -s, c, center.x - center.x * c + center.y * s, center.y - center.y * c - center.x * s); + }; + /** + * rotationFromVector + * + * @param {Vector2D} + * @returns {Matrix2D} + */ + + + Matrix2D.rotationFromVector = function (vector) { + var unit = vector.unit(); + var c = unit.x; // cos + + var s = unit.y; // sin + + return new Matrix2D(c, s, -s, c, 0, 0); + }; + /** + * xFlip + * + * @returns {Matrix2D} + */ + + + Matrix2D.xFlip = function () { + return new Matrix2D(-1, 0, 0, 1, 0, 0); + }; + /** + * yFlip + * + * @returns {Matrix2D} + */ + + + Matrix2D.yFlip = function () { + return new Matrix2D(1, 0, 0, -1, 0, 0); + }; + /** + * xSkew + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.xSkew = function (radians) { + var t = Math.tan(radians); + return new Matrix2D(1, 0, t, 1, 0, 0); + }; + /** + * ySkew + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.ySkew = function (radians) { + var t = Math.tan(radians); + return new Matrix2D(1, t, 0, 1, 0, 0); + }; // *** METHODS + + /** + * multiply + * + * @pararm {Matrix2D} that + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.multiply = function (that) { + if (this.isIdentity()) { + return that; + } + + if (that.isIdentity()) { + return this; + } + + return new this.constructor(this.a * that.a + this.c * that.b, this.b * that.a + this.d * that.b, this.a * that.c + this.c * that.d, this.b * that.c + this.d * that.d, this.a * that.e + this.c * that.f + this.e, this.b * that.e + this.d * that.f + this.f); + }; + /** + * inverse + * + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.inverse = function () { + if (this.isIdentity()) { + return this; + } + + var det1 = this.a * this.d - this.b * this.c; + + if (det1 === 0.0) { + throw "Matrix is not invertible"; + } + + var idet = 1.0 / det1; + var det2 = this.f * this.c - this.e * this.d; + var det3 = this.e * this.b - this.f * this.a; + return new this.constructor(this.d * idet, -this.b * idet, -this.c * idet, this.a * idet, det2 * idet, det3 * idet); + }; + /** + * translate + * + * @param {Number} tx + * @param {Number} ty + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.translate = function (tx, ty) { + return new this.constructor(this.a, this.b, this.c, this.d, this.a * tx + this.c * ty + this.e, this.b * tx + this.d * ty + this.f); + }; + /** + * scale + * + * @param {Number} scale + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scale = function (scale) { + return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.e, this.f); + }; + /** + * scaleAt + * + * @param {Number} scale + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scaleAt = function (scale, center) { + var dx = center.x - scale * center.x; + var dy = center.y - scale * center.y; + return new this.constructor(this.a * scale, this.b * scale, this.c * scale, this.d * scale, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); + }; + /** + * scaleNonUniform + * + * @param {Number} scaleX + * @param {Number} scaleY + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scaleNonUniform = function (scaleX, scaleY) { + return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.e, this.f); + }; + /** + * scaleNonUniformAt + * + * @param {Number} scaleX + * @param {Number} scaleY + * @param {Point2D} center + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.scaleNonUniformAt = function (scaleX, scaleY, center) { + var dx = center.x - scaleX * center.x; + var dy = center.y - scaleY * center.y; + return new this.constructor(this.a * scaleX, this.b * scaleX, this.c * scaleY, this.d * scaleY, this.a * dx + this.c * dy + this.e, this.b * dx + this.d * dy + this.f); + }; + /** + * rotate + * + * @param {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.rotate = function (radians) { + var c = Math.cos(radians); + var s = Math.sin(radians); + return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); + }; + /** + * rotateAt + * + * @param {Number} radians + * @param {Point2D} center + * @result {Matrix2D} + */ + + + Matrix2D.prototype.rotateAt = function (radians, center) { + var cos = Math.cos(radians); + var sin = Math.sin(radians); + var cx = center.x; + var cy = center.y; + var a = this.a * cos + this.c * sin; + var b = this.b * cos + this.d * sin; + var c = this.c * cos - this.a * sin; + var d = this.d * cos - this.b * sin; + return new this.constructor(a, b, c, d, (this.a - a) * cx + (this.c - c) * cy + this.e, (this.b - b) * cx + (this.d - d) * cy + this.f); + }; + /** + * rotateFromVector + * + * @param {Vector2D} + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.rotateFromVector = function (vector) { + var unit = vector.unit(); + var c = unit.x; // cos + + var s = unit.y; // sin + + return new this.constructor(this.a * c + this.c * s, this.b * c + this.d * s, this.a * -s + this.c * c, this.b * -s + this.d * c, this.e, this.f); + }; + /** + * flipX + * + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.flipX = function () { + return new this.constructor(-this.a, -this.b, this.c, this.d, this.e, this.f); + }; + /** + * flipY + * + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.flipY = function () { + return new this.constructor(this.a, this.b, -this.c, -this.d, this.e, this.f); + }; + /** + * skewX + * + * @pararm {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.skewX = function (radians) { + var t = Math.tan(radians); + return new this.constructor(this.a, this.b, this.c + this.a * t, this.d + this.b * t, this.e, this.f); + }; // TODO: skewXAt + + /** + * skewY + * + * @pararm {Number} radians + * @returns {Matrix2D} + */ + + + Matrix2D.prototype.skewY = function (radians) { + var t = Math.tan(radians); + return new this.constructor(this.a + this.c * t, this.b + this.d * t, this.c, this.d, this.e, this.f); + }; // TODO: skewYAt + + /** + * isIdentity + * + * @returns {Boolean} + */ + + + Matrix2D.prototype.isIdentity = function () { + return this.a === 1.0 && this.b === 0.0 && this.c === 0.0 && this.d === 1.0 && this.e === 0.0 && this.f === 0.0; + }; + /** + * isInvertible + * + * @returns {Boolean} + */ + + + Matrix2D.prototype.isInvertible = function () { + return this.a * this.d - this.b * this.c !== 0.0; + }; + /** + * getScale + * + * @returns {{ scaleX: Number, scaleY: Number }} + */ + + + Matrix2D.prototype.getScale = function () { + return { + scaleX: Math.sqrt(this.a * this.a + this.c * this.c), + scaleY: Math.sqrt(this.b * this.b + this.d * this.d) + }; + }; + /** + * getDecomposition + * + * Calculates matrix Singular Value Decomposition + * + * The resulting matrices, translation, rotation, scale, and rotation0, return + * this matrix when they are muliplied together in the listed order + * + * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688} + * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation} + * + * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }} + */ + + + Matrix2D.prototype.getDecomposition = function () { + var E = (this.a + this.d) * 0.5; + var F = (this.a - this.d) * 0.5; + var G = (this.b + this.c) * 0.5; + var H = (this.b - this.c) * 0.5; + var Q = Math.sqrt(E * E + H * H); + var R = Math.sqrt(F * F + G * G); + var scaleX = Q + R; + var scaleY = Q - R; + var a1 = Math.atan2(G, F); + var a2 = Math.atan2(H, E); + var theta = (a2 - a1) * 0.5; + var phi = (a2 + a1) * 0.5; // TODO: Add static methods to generate translation, rotation, etc. + // matrices directly + + return { + translation: new this.constructor(1, 0, 0, 1, this.e, this.f), + rotation: this.constructor.IDENTITY.rotate(phi), + scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0), + rotation0: this.constructor.IDENTITY.rotate(theta) + }; + }; + /** + * equals + * + * @param {Matrix2D} that + * @returns {Boolean} + */ + + + Matrix2D.prototype.equals = function (that) { + return this.a === that.a && this.b === that.b && this.c === that.c && this.d === that.d && this.e === that.e && this.f === that.f; + }; + /** + * precisionEquals + * + * @param {Matrix2D} that + * @param {Number} precision + * @returns {Boolean} + */ + + + Matrix2D.prototype.precisionEquals = function (that, precision) { + return Math.abs(this.a - that.a) < precision && Math.abs(this.b - that.b) < precision && Math.abs(this.c - that.c) < precision && Math.abs(this.d - that.d) < precision && Math.abs(this.e - that.e) < precision && Math.abs(this.f - that.f) < precision; + }; + /** + * toString + * + * @returns {String} + */ + + + Matrix2D.prototype.toString = function () { + return "matrix(" + [this.a, this.b, this.c, this.d, this.e, this.f].join(",") + ")"; + }; + + { + module.exports = Matrix2D; + } + }); + + // expose classes + var Point2D = Point2D_1; + var Vector2D = Vector2D_1; + var Matrix2D = Matrix2D_1; + + var Polynomial_1 = createCommonjsModule(function (module) { + /** + * + * Polynomial.js + * + * copyright 2002, 2013 Kevin Lindsey + * + * contribution {@link http://github.com/Quazistax/kld-polynomial} + * @copyright 2015 Robert Benko (Quazistax) + * @license MIT + */ + Polynomial.TOLERANCE = 1e-6; + Polynomial.ACCURACY = 15; + /** + * interpolate + * + * Based on poloint in "Numerical Recipes in C, 2nd Edition", pages 109-110 + * + * @param {Array} xs + * @param {Array} ys + * @param {Number} n + * @param {Number} offset + * @param {Number} x + * + * @returns {{y: Number, dy: Number}} + */ + + Polynomial.interpolate = function (xs, ys, n, offset, x) { + if (xs.constructor !== Array || ys.constructor !== Array) { + throw new Error("Polynomial.interpolate: xs and ys must be arrays"); + } + + if (isNaN(n) || isNaN(offset) || isNaN(x)) { + throw new Error("Polynomial.interpolate: n, offset, and x must be numbers"); + } + + var y = 0; + var dy = 0; + var c = new Array(n); + var d = new Array(n); + var ns = 0; + var diff = Math.abs(x - xs[offset]); + + for (var i = 0; i < n; i++) { + var dift = Math.abs(x - xs[offset + i]); + + if (dift < diff) { + ns = i; + diff = dift; + } + + c[i] = d[i] = ys[offset + i]; + } + + y = ys[offset + ns]; + ns--; + + for (var m = 1; m < n; m++) { + for (var i = 0; i < n - m; i++) { + var ho = xs[offset + i] - x; + var hp = xs[offset + i + m] - x; + var w = c[i + 1] - d[i]; + var den = ho - hp; + + if (den == 0.0) { + throw new Error("Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)"); + } + + den = w / den; + d[i] = hp * den; + c[i] = ho * den; + } + + dy = 2 * (ns + 1) < n - m ? c[ns + 1] : d[ns--]; + y += dy; + } + + return { + y: y, + dy: dy + }; + }; + /** + * Polynomial + * + * @returns {Polynomial} + */ + + + function Polynomial() { + this.init(arguments); + } + /** + * init + */ + + + Polynomial.prototype.init = function (coefs) { + this.coefs = new Array(); + + for (var i = coefs.length - 1; i >= 0; i--) { + this.coefs.push(coefs[i]); + } + + this._variable = "t"; + this._s = 0; + }; + /** + * eval + */ + + + Polynomial.prototype.eval = function (x) { + if (isNaN(x)) { + throw new Error("Polynomial.eval: parameter must be a number"); + } + + var result = 0; + + for (var i = this.coefs.length - 1; i >= 0; i--) { + result = result * x + this.coefs[i]; + } + + return result; + }; + /** + * add + */ + + + Polynomial.prototype.add = function (that) { + var result = new Polynomial(); + var d1 = this.getDegree(); + var d2 = that.getDegree(); + var dmax = Math.max(d1, d2); + + for (var i = 0; i <= dmax; i++) { + var v1 = i <= d1 ? this.coefs[i] : 0; + var v2 = i <= d2 ? that.coefs[i] : 0; + result.coefs[i] = v1 + v2; + } + + return result; + }; + /** + * multiply + */ + + + Polynomial.prototype.multiply = function (that) { + var result = new Polynomial(); + + for (var i = 0; i <= this.getDegree() + that.getDegree(); i++) { + result.coefs.push(0); + } + + for (var i = 0; i <= this.getDegree(); i++) { + for (var j = 0; j <= that.getDegree(); j++) { + result.coefs[i + j] += this.coefs[i] * that.coefs[j]; + } + } + + return result; + }; + /** + * divide_scalar + */ + + + Polynomial.prototype.divide_scalar = function (scalar) { + for (var i = 0; i < this.coefs.length; i++) { + this.coefs[i] /= scalar; + } + }; + /** + * simplify + */ + + + Polynomial.prototype.simplify = function (TOLERANCE) { + if (TOLERANCE === undefined) TOLERANCE = 1e-12; + + for (var i = this.getDegree(); i >= 0; i--) { + if (Math.abs(this.coefs[i]) <= TOLERANCE) { + this.coefs.pop(); + } else { + break; + } + } + }; + /** + * bisection + */ + + + Polynomial.prototype.bisection = function (min, max) { + var minValue = this.eval(min); + var maxValue = this.eval(max); + var result; + + if (Math.abs(minValue) <= Polynomial.TOLERANCE) { + result = min; + } else if (Math.abs(maxValue) <= Polynomial.TOLERANCE) { + result = max; + } else if (minValue * maxValue <= 0) { + var tmp1 = Math.log(max - min); + var tmp2 = Math.LN10 * Polynomial.ACCURACY; + var iters = Math.ceil((tmp1 + tmp2) / Math.LN2); + + for (var i = 0; i < iters; i++) { + result = 0.5 * (min + max); + var value = this.eval(result); + + if (Math.abs(value) <= Polynomial.TOLERANCE) { + break; + } + + if (value * minValue < 0) { + max = result; + maxValue = value; + } else { + min = result; + minValue = value; + } + } + } + + return result; + }; + /** + * toString + */ + + + Polynomial.prototype.toString = function () { + var coefs = new Array(); + var signs = new Array(); + + for (var i = this.coefs.length - 1; i >= 0; i--) { + var value = Math.round(this.coefs[i] * 1000) / 1000; //var value = this.coefs[i]; + + if (value != 0) { + var sign = value < 0 ? " - " : " + "; + value = Math.abs(value); + + if (i > 0) { + if (value == 1) { + value = this._variable; + } else { + value += this._variable; + } + } + + if (i > 1) { + value += "^" + i; + } + + signs.push(sign); + coefs.push(value); + } + } + + signs[0] = signs[0] == " + " ? "" : "-"; + var result = ""; + + for (var i = 0; i < coefs.length; i++) { + result += signs[i] + coefs[i]; + } + + return result; + }; + /** + * trapezoid + * + * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 137 + */ + + + Polynomial.prototype.trapezoid = function (min, max, n) { + if (isNaN(min) || isNaN(max) || isNaN(n)) { + throw new Error("Polynomial.trapezoid: parameters must be numbers"); + } + + var range = max - min; + + if (n == 1) { + var minValue = this.eval(min); + var maxValue = this.eval(max); + this._s = 0.5 * range * (minValue + maxValue); + } else { + var it = 1 << n - 2; + var delta = range / it; + var x = min + 0.5 * delta; + var sum = 0; + + for (var i = 0; i < it; i++) { + sum += this.eval(x); + x += delta; + } + + this._s = 0.5 * (this._s + range * sum / it); + } + + if (isNaN(this._s)) { + throw new Error("Polynomial.trapezoid: this._s is NaN"); + } + + return this._s; + }; + /** + * simpson + * + * Based on trapzd in "Numerical Recipes in C, 2nd Edition", page 139 + */ + + + Polynomial.prototype.simpson = function (min, max) { + if (isNaN(min) || isNaN(max)) { + throw new Error("Polynomial.simpson: parameters must be numbers"); + } + + var range = max - min; + var st = 0.5 * range * (this.eval(min) + this.eval(max)); + var t = st; + var s = 4.0 * st / 3.0; + var os = s; + var ost = st; + var TOLERANCE = 1e-7; + var it = 1; + + for (var n = 2; n <= 20; n++) { + var delta = range / it; + var x = min + 0.5 * delta; + var sum = 0; + + for (var i = 1; i <= it; i++) { + sum += this.eval(x); + x += delta; + } + + t = 0.5 * (t + range * sum / it); + st = t; + s = (4.0 * st - ost) / 3.0; + + if (Math.abs(s - os) < TOLERANCE * Math.abs(os)) { + break; + } + + os = s; + ost = st; + it <<= 1; + } + + return s; + }; + /** + * romberg + */ + + + Polynomial.prototype.romberg = function (min, max) { + if (isNaN(min) || isNaN(max)) { + throw new Error("Polynomial.romberg: parameters must be numbers"); + } + + var MAX = 20; + var K = 3; + var TOLERANCE = 1e-6; + var s = new Array(MAX + 1); + var h = new Array(MAX + 1); + var result = { + y: 0, + dy: 0 + }; + h[0] = 1.0; + + for (var j = 1; j <= MAX; j++) { + s[j - 1] = this.trapezoid(min, max, j); + + if (j >= K) { + result = Polynomial.interpolate(h, s, K, j - K, 0.0); + if (Math.abs(result.dy) <= TOLERANCE * result.y) break; + } + + s[j] = s[j - 1]; + h[j] = 0.25 * h[j - 1]; + } + + return result.y; + }; // getters and setters + + /** + * get degree + */ + + + Polynomial.prototype.getDegree = function () { + return this.coefs.length - 1; + }; + /** + * getDerivative + */ + + + Polynomial.prototype.getDerivative = function () { + var derivative = new Polynomial(); + + for (var i = 1; i < this.coefs.length; i++) { + derivative.coefs.push(i * this.coefs[i]); + } + + return derivative; + }; + /** + * getRoots + */ + + + Polynomial.prototype.getRoots = function () { + var result; + this.simplify(); + + switch (this.getDegree()) { + case 0: + result = []; + break; - case 1: - result = this.getLinearRoot(); - break; - - case 2: - result = this.getQuadraticRoots(); - break; + case 1: + result = this.getLinearRoot(); + break; + + case 2: + result = this.getQuadraticRoots(); + break; - case 3: - result = this.getCubicRoots(); - break; - - case 4: - result = this.getQuarticRoots(); - break; - - default: - result = []; - } - - return result; - }; - /** - * getRootsInInterval - */ - - - Polynomial.prototype.getRootsInInterval = function (min, max) { - var roots = new Array(); - var root; - - if (this.getDegree() == 1) { - root = this.bisection(min, max); - - if (root != null) { - roots.push(root); - } - } else { - // get roots of derivative - var deriv = this.getDerivative(); - var droots = deriv.getRootsInInterval(min, max); - - if (droots.length > 0) { - // find root on [min, droots[0]] - root = this.bisection(min, droots[0]); - - if (root != null) { - roots.push(root); - } // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2 - - - for (i = 0; i <= droots.length - 2; i++) { - root = this.bisection(droots[i], droots[i + 1]); - - if (root != null) { - roots.push(root); - } - } // find root on [droots[count-1],xmax] - - - root = this.bisection(droots[droots.length - 1], max); - - if (root != null) { - roots.push(root); - } - } else { - // polynomial is monotone on [min,max], has at most one root - root = this.bisection(min, max); - - if (root != null) { - roots.push(root); - } - } - } - - return roots; - }; - /** - * getLinearRoot - */ - - - Polynomial.prototype.getLinearRoot = function () { - var result = []; - var a = this.coefs[1]; - - if (a != 0) { - result.push(-this.coefs[0] / a); - } - - return result; - }; - /** - * getQuadraticRoots - */ - - - Polynomial.prototype.getQuadraticRoots = function () { - var results = []; - - if (this.getDegree() == 2) { - var a = this.coefs[2]; - var b = this.coefs[1] / a; - var c = this.coefs[0] / a; - var d = b * b - 4 * c; - - if (d > 0) { - var e = Math.sqrt(d); - results.push(0.5 * (-b + e)); - results.push(0.5 * (-b - e)); - } else if (d == 0) { - // really two roots with same value, but we only return one - results.push(0.5 * -b); - } - } - - return results; - }; - /** - * getCubicRoots - * - * This code is based on MgcPolynomial.cpp written by David Eberly. His - * code along with many other excellent examples are avaiable at his site: - * http://www.geometrictools.com - */ - - - Polynomial.prototype.getCubicRoots = function () { - var results = []; - - if (this.getDegree() == 3) { - var c3 = this.coefs[3]; - var c2 = this.coefs[2] / c3; - var c1 = this.coefs[1] / c3; - var c0 = this.coefs[0] / c3; - var a = (3 * c1 - c2 * c2) / 3; - var b = (2 * c2 * c2 * c2 - 9 * c1 * c2 + 27 * c0) / 27; - var offset = c2 / 3; - var discrim = b * b / 4 + a * a * a / 27; - var halfB = b / 2; - var ZEROepsilon = this.zeroErrorEstimate(); - - if (Math.abs(discrim) <= ZEROepsilon) { - discrim = 0; - } - - if (discrim > 0) { - var e = Math.sqrt(discrim); - var tmp; - var root; - tmp = -halfB + e; - - if (tmp >= 0) { - root = Math.pow(tmp, 1 / 3); - } else { - root = -Math.pow(-tmp, 1 / 3); - } - - tmp = -halfB - e; - - if (tmp >= 0) { - root += Math.pow(tmp, 1 / 3); - } else { - root -= Math.pow(-tmp, 1 / 3); - } - - results.push(root - offset); - } else if (discrim < 0) { - var distance = Math.sqrt(-a / 3); - var angle = Math.atan2(Math.sqrt(-discrim), -halfB) / 3; - var cos = Math.cos(angle); - var sin = Math.sin(angle); - var sqrt3 = Math.sqrt(3); - results.push(2 * distance * cos - offset); - results.push(-distance * (cos + sqrt3 * sin) - offset); - results.push(-distance * (cos - sqrt3 * sin) - offset); - } else { - var tmp; - - if (halfB >= 0) { - tmp = -Math.pow(halfB, 1 / 3); - } else { - tmp = Math.pow(-halfB, 1 / 3); - } - - results.push(2 * tmp - offset); // really should return next root twice, but we return only one - - results.push(-tmp - offset); - } - } - - return results; - }; - /** - * Sign of a number (+1, -1, +0, -0). - */ - - - var sign = function sign(x) { - return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN; - }; - /** - * Calculates roots of quartic polynomial.
- * First, derivative roots are found, then used to split quartic polynomial - * into segments, each containing one root of quartic polynomial. - * Segments are then passed to newton's method to find roots. - * - * @returns {Array} roots - */ - - - Polynomial.prototype.getQuarticRoots = function () { - var results = []; - var n = this.getDegree(); - - if (n == 4) { - var poly = new Polynomial(); - poly.coefs = this.coefs.slice(); - poly.divide_scalar(poly.coefs[n]); - var ERRF = 1e-15; - - if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) { - poly.coefs[0] = 0; - } - - var poly_d = poly.getDerivative(); - var derrt = poly_d.getRoots().sort(function (a, b) { - return a - b; - }); - var dery = []; - var nr = derrt.length - 1; - var i; - var rb = this.bounds(); - maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); - var ZEROepsilon = this.zeroErrorEstimate(maxabsX); - - for (i = 0; i <= nr; i++) { - dery.push(poly.eval(derrt[i])); - } - - for (i = 0; i <= nr; i++) { - if (Math.abs(dery[i]) < ZEROepsilon) { - dery[i] = 0; - } - } - - i = 0; - var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF); - var guesses = []; - var minmax = []; - - if (nr > -1) { - if (dery[0] != 0) { - if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) { - guesses.push(derrt[0] - dx); - minmax.push([rb.minX, derrt[0]]); - } - } else { - results.push(derrt[0], derrt[0]); - i++; - } - - for (; i < nr; i++) { - if (dery[i + 1] == 0) { - results.push(derrt[i + 1], derrt[i + 1]); - i++; - } else if (sign(dery[i]) != sign(dery[i + 1])) { - guesses.push((derrt[i] + derrt[i + 1]) / 2); - minmax.push([derrt[i], derrt[i + 1]]); - } - } - - if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) { - guesses.push(derrt[nr] + dx); - minmax.push([derrt[nr], rb.maxX]); - } - } - - var f = function f(x) { - return poly.eval(x); - }; - - var df = function df(x) { - return poly_d.eval(x); - }; - - if (guesses.length > 0) { - for (i = 0; i < guesses.length; i++) { - guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]); - } - } - - results = results.concat(guesses); - } - - return results; - }; - /** - * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0. - * - * @returns {Number} - */ - - - Polynomial.prototype.zeroErrorEstimate = function (maxabsX) { - var poly = this; - var ERRF = 1e-15; - - if (typeof maxabsX === 'undefined') { - var rb = poly.bounds(); - maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); - } - - if (maxabsX < 0.001) { - return 2 * Math.abs(poly.eval(ERRF)); - } - - var n = poly.coefs.length - 1; - var an = poly.coefs[n]; - return 10 * ERRF * poly.coefs.reduce(function (m, v, i) { - var nm = v / an * Math.pow(maxabsX, i); - return nm > m ? nm : m; - }, 0); - }; - /** - * Calculates upper Real roots bounds.
- * Real roots are in interval [negX, posX]. Determined by Fujiwara method. - * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} - * - * @returns {{ negX: Number, posX: Number }} - */ - - - Polynomial.prototype.bounds_UpperReal_Fujiwara = function () { - var a = this.coefs; - var n = a.length - 1; - var an = a[n]; - - if (an != 1) { - a = this.coefs.map(function (v) { - return v / an; - }); - } - - var b = a.map(function (v, i) { - return i < n ? Math.pow(Math.abs(i == 0 ? v / 2 : v), 1 / (n - i)) : v; - }); - var coefSelectionFunc; - - var find2Max = function find2Max(acc, bi, i) { - if (coefSelectionFunc(i)) { - if (acc.max < bi) { - acc.nearmax = acc.max; - acc.max = bi; - } else if (acc.nearmax < bi) { - acc.nearmax = bi; - } - } - - return acc; - }; - - coefSelectionFunc = function coefSelectionFunc(i) { - return i < n && a[i] < 0; - }; - - var max_nearmax_pos = b.reduce(find2Max, { - max: 0, - nearmax: 0 - }); - - coefSelectionFunc = function coefSelectionFunc(i) { - return i < n && (n % 2 == i % 2 ? a[i] < 0 : a[i] > 0); - }; - - var max_nearmax_neg = b.reduce(find2Max, { - max: 0, - nearmax: 0 - }); - return { - negX: -2 * max_nearmax_neg.max, - posX: 2 * max_nearmax_pos.max - }; - }; - /** - * Calculates lower Real roots bounds.
- * There are no Real roots in interval . Determined by Fujiwara method. - * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} - * - * @returns {{ negX: Number, posX: Number }} - */ - - - Polynomial.prototype.bounds_LowerReal_Fujiwara = function () { - var poly = new Polynomial(); - poly.coefs = this.coefs.slice().reverse(); - var res = poly.bounds_UpperReal_Fujiwara(); - res.negX = 1 / res.negX; - res.posX = 1 / res.posX; - return res; - }; - /** - * Calculates left and right Real roots bounds.
- * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval. - * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} - * - * @returns {{ minX: Number, maxX: Number }} - */ - - - Polynomial.prototype.bounds = function () { - var urb = this.bounds_UpperReal_Fujiwara(); - var rb = { - minX: urb.negX, - maxX: urb.posX - }; - - if (urb.negX === 0 && urb.posX === 0) { - return rb; - } - - if (urb.negX === 0) { - rb.minX = this.bounds_LowerReal_Fujiwara().posX; - } else if (urb.posX === 0) { - rb.maxX = this.bounds_LowerReal_Fujiwara().negX; - } - - if (rb.minX > rb.maxX) { - //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?'); - rb.minX = rb.maxX = 0; - } - - return rb; // TODO: if sure that there are no complex roots - // (maybe by using Sturm's theorem) use: - // return this.bounds_Real_Laguerre(); - }; - /** - * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
- * When using bounds, algorithm falls back to secant if newton goes out of range. - * Bisection is fallback for secant when determined secant is not efficient enough. - * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method} - * @see {@link http://en.wikipedia.org/wiki/Secant_method} - * @see {@link http://en.wikipedia.org/wiki/Bisection_method} - * - * @param {Number} x0 - Inital root guess - * @param {function(x)} f - Function which root we are trying to find - * @param {function(x)} df - Derivative of function f - * @param {Number} max_iterations - Maximum number of algorithm iterations - * @param {Number} [min_x] - Left bound value - * @param {Number} [max_x] - Right bound value - * @returns {Number} - root - */ - - - Polynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) { - var x, - prev_dfx = 0, - dfx, - prev_x_ef_correction = 0, - x_correction, - x_new; - var y_atmin, y_atmax; - x = x0; - var ACCURACY = 14; - var min_correction_factor = Math.pow(10, -ACCURACY); - var isBounded = typeof min === 'number' && typeof max === 'number'; - - if (isBounded) { - if (min > max) { - throw new Error("newton root finding: min must be greater than max"); - } - - y_atmin = f(min); - y_atmax = f(max); - - if (sign(y_atmin) == sign(y_atmax)) { - throw new Error("newton root finding: y values of bounds must be of opposite sign"); - } - } - - var isEnoughCorrection = function isEnoughCorrection() { - // stop if correction is too small or if correction is in simple loop - return Math.abs(x_correction) <= min_correction_factor * Math.abs(x) || prev_x_ef_correction == x - x_correction - x; - }; - - var i; - - for (i = 0; i < max_iterations; i++) { - dfx = df(x); - - if (dfx == 0) { - if (prev_dfx == 0) { - // error - throw new Error("newton root finding: df(x) is zero"); - } else { - // use previous derivation value - dfx = prev_dfx; - } // or move x a little? - //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15); - - } - - prev_dfx = dfx; - y = f(x); - x_correction = y / dfx; - x_new = x - x_correction; - - if (isEnoughCorrection()) { - break; - } - - if (isBounded) { - if (sign(y) == sign(y_atmax)) { - max = x; - y_atmax = y; - } else if (sign(y) == sign(y_atmin)) { - min = x; - y_atmin = y; - } else { - x = x_new; - break; - } - - if (x_new < min || x_new > max) { - if (sign(y_atmin) == sign(y_atmax)) { - break; - } - - var RATIO_LIMIT = 50; - var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5) - - var dy = y_atmax - y_atmin; - var dx = max - min; - - if (dy == 0) { - x_correction = x - (min + dx * 0.5); - } else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) { - x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET))); - } else { - x_correction = x - (min - y_atmin / dy * dx); - } - - x_new = x - x_correction; - - if (isEnoughCorrection()) { - break; - } - } - } - - prev_x_ef_correction = x - x_new; - x = x_new; - } - - return x; - }; - - { - module.exports = Polynomial; - } - }); - - var SqrtPolynomial_1 = createCommonjsModule(function (module) { - /** - * - * SqrtPolynomial.js - * - * copyright 2003, 2013 Kevin Lindsey - * - */ - { - var Polynomial = Polynomial_1; - } - /** - * class variables - */ - - - SqrtPolynomial.VERSION = 1.0; // setup inheritance - - SqrtPolynomial.prototype = new Polynomial(); - SqrtPolynomial.prototype.constructor = SqrtPolynomial; - SqrtPolynomial.superclass = Polynomial.prototype; - /** - * SqrtPolynomial - */ - - function SqrtPolynomial() { - this.init(arguments); - } - /** - * eval - * - * @param {Number} x - * @returns {Number} - */ - - - SqrtPolynomial.prototype.eval = function (x) { - var TOLERANCE = 1e-7; - var result = SqrtPolynomial.superclass.eval.call(this, x); // NOTE: May need to change the following. I added these to capture - // some really small negative values that were being generated by one - // of my Bezier arcLength functions - - if (Math.abs(result) < TOLERANCE) result = 0; - if (result < 0) throw new Error("SqrtPolynomial.eval: cannot take square root of negative number"); - return Math.sqrt(result); - }; - - SqrtPolynomial.prototype.toString = function () { - var result = SqrtPolynomial.superclass.toString.call(this); - return "sqrt(" + result + ")"; - }; - - { - module.exports = SqrtPolynomial; - } - }); - - // expose classes - var Polynomial = Polynomial_1; - - /* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */ - /** - * - * @param {*} o - * @returns {boolean} - */ - - function isNullish(o) { - return o === null || o === undefined; - } - /** - * closePolygon - * - * @param {Array} points - * @returns {Array} - */ - - - function closePolygon(points) { - var copy = points.slice(); - copy.push(points[0]); - return copy; - } - /** - * Intersection - * @class - * @param {string} status - */ - - - function Intersection(status) { - this.init(status); - } - /** - * init - * - * @param {string} status - * @returns {Intersection} - */ - - - Intersection.prototype.init = function (status) { - this.status = status; - this.points = []; - }; - /** - * appendPoint - * - * @param {Point2D} point - */ - - - Intersection.prototype.appendPoint = function (point) { - this.points.push(point); - }; - /** - * appendPoints - * - * @param {Array} points - */ - - - Intersection.prototype.appendPoints = function (points) { - this.points = this.points.concat(points); - }; // static methods - - /** - * intersect - * - * @param {IntersectionArgs} shape1 - * @param {IntersectionArgs} shape2 - * @returns {Intersection} - */ - - - Intersection.intersect = function (shape1, shape2) { - var result; - - if (!isNullish(shape1) && !isNullish(shape2)) { - if (shape1.name === "Path") { - result = Intersection.intersectPathShape(shape1, shape2); - } else if (shape2.name === "Path") { - result = Intersection.intersectPathShape(shape2, shape1); - } else { - var method; - var args; - - if (shape1.name < shape2.name) { - method = "intersect" + shape1.name + shape2.name; - args = shape1.args.concat(shape2.args); - } else { - method = "intersect" + shape2.name + shape1.name; - args = shape2.args.concat(shape1.args); - } - - if (!(method in Intersection)) { - throw new Error("Intersection not available: " + method); - } - - result = Intersection[method].apply(null, args); - } - } else { - result = new Intersection("No Intersection"); - } - - return result; - }; - /** - * intersectPathShape - * - * @param {IntersectionArgs} path - * @param {IntersectionArgs} shape - * @returns {Intersection} - */ - - - Intersection.intersectPathShape = function (path, shape) { - var result = new Intersection("No Intersection"); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = path.args[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var segment = _step.value; - var inter = Intersection.intersect(segment, shape); - result.appendPoints(inter.points); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator["return"] != null) { - _iterator["return"](); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier2Bezier2 - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Bezier2 = function (a1, a2, a3, b1, b2, b3) { - var a, b; - var result = new Intersection("No Intersection"); - a = a2.multiply(-2); - var c12 = a1.add(a.add(a3)); - a = a1.multiply(-2); - b = a2.multiply(2); - var c11 = a.add(b); - var c10 = new Point2D(a1.x, a1.y); - a = b2.multiply(-2); - var c22 = b1.add(a.add(b3)); - a = b1.multiply(-2); - b = b2.multiply(2); - var c21 = a.add(b); - var c20 = new Point2D(b1.x, b1.y); // bezout - - a = c12.x * c11.y - c11.x * c12.y; - b = c22.x * c11.y - c11.x * c22.y; - var c = c21.x * c11.y - c11.x * c21.y; - var d = c11.x * (c10.y - c20.y) + c11.y * (-c10.x + c20.x); - var e = c22.x * c12.y - c12.x * c22.y; - var f = c21.x * c12.y - c12.x * c21.y; - var g = c12.x * (c10.y - c20.y) + c12.y * (-c10.x + c20.x); // determinant - - var poly = new Polynomial(-e * e, -2 * e * f, a * b - f * f - 2 * e * g, a * c - 2 * f * g, a * d - g * g); - var roots = poly.getRoots(); - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = roots[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var s = _step2.value; - - if (0 <= s && s <= 1) { - var xp = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x); - xp.simplify(); - var xRoots = xp.getRoots(); - var yp = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y); - yp.simplify(); - var yRoots = yp.getRoots(); - - if (xRoots.length > 0 && yRoots.length > 0) { - var TOLERANCE = 1e-4; - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; - - try { - checkRoots: for (var _iterator3 = xRoots[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var xRoot = _step3.value; - - if (0 <= xRoot && xRoot <= 1) { - for (var k = 0; k < yRoots.length; k++) { - if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { - result.points.push(c22.multiply(s * s).add(c21.multiply(s).add(c20))); - break checkRoots; - } - } - } - } - } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; - } finally { - try { - if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { - _iterator3["return"](); - } - } finally { - if (_didIteratorError3) { - throw _iteratorError3; - } - } - } - } - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { - _iterator2["return"](); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier2Bezier3 - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Bezier3 = function (a1, a2, a3, b1, b2, b3, b4) { - var a, b, c, d; - var result = new Intersection("No Intersection"); - a = a2.multiply(-2); - var c12 = a1.add(a.add(a3)); - a = a1.multiply(-2); - b = a2.multiply(2); - var c11 = a.add(b); - var c10 = new Point2D(a1.x, a1.y); - a = b1.multiply(-1); - b = b2.multiply(3); - c = b3.multiply(-3); - d = a.add(b.add(c.add(b4))); - var c23 = new Vector2D(d.x, d.y); - a = b1.multiply(3); - b = b2.multiply(-6); - c = b3.multiply(3); - d = a.add(b.add(c)); - var c22 = new Vector2D(d.x, d.y); - a = b1.multiply(-3); - b = b2.multiply(3); - c = a.add(b); - var c21 = new Vector2D(c.x, c.y); - var c20 = new Vector2D(b1.x, b1.y); - var c10x2 = c10.x * c10.x; - var c10y2 = c10.y * c10.y; - var c11x2 = c11.x * c11.x; - var c11y2 = c11.y * c11.y; - var c12x2 = c12.x * c12.x; - var c12y2 = c12.y * c12.y; - var c20x2 = c20.x * c20.x; - var c20y2 = c20.y * c20.y; - var c21x2 = c21.x * c21.x; - var c21y2 = c21.y * c21.y; - var c22x2 = c22.x * c22.x; - var c22y2 = c22.y * c22.y; - var c23x2 = c23.x * c23.x; - var c23y2 = c23.y * c23.y; - var poly = new Polynomial(-2 * c12.x * c12.y * c23.x * c23.y + c12x2 * c23y2 + c12y2 * c23x2, -2 * c12.x * c12.y * c22.x * c23.y - 2 * c12.x * c12.y * c22.y * c23.x + 2 * c12y2 * c22.x * c23.x + 2 * c12x2 * c22.y * c23.y, -2 * c12.x * c21.x * c12.y * c23.y - 2 * c12.x * c12.y * c21.y * c23.x - 2 * c12.x * c12.y * c22.x * c22.y + 2 * c21.x * c12y2 * c23.x + c12y2 * c22x2 + c12x2 * (2 * c21.y * c23.y + c22y2), 2 * c10.x * c12.x * c12.y * c23.y + 2 * c10.y * c12.x * c12.y * c23.x + c11.x * c11.y * c12.x * c23.y + c11.x * c11.y * c12.y * c23.x - 2 * c20.x * c12.x * c12.y * c23.y - 2 * c12.x * c20.y * c12.y * c23.x - 2 * c12.x * c21.x * c12.y * c22.y - 2 * c12.x * c12.y * c21.y * c22.x - 2 * c10.x * c12y2 * c23.x - 2 * c10.y * c12x2 * c23.y + 2 * c20.x * c12y2 * c23.x + 2 * c21.x * c12y2 * c22.x - c11y2 * c12.x * c23.x - c11x2 * c12.y * c23.y + c12x2 * (2 * c20.y * c23.y + 2 * c21.y * c22.y), 2 * c10.x * c12.x * c12.y * c22.y + 2 * c10.y * c12.x * c12.y * c22.x + c11.x * c11.y * c12.x * c22.y + c11.x * c11.y * c12.y * c22.x - 2 * c20.x * c12.x * c12.y * c22.y - 2 * c12.x * c20.y * c12.y * c22.x - 2 * c12.x * c21.x * c12.y * c21.y - 2 * c10.x * c12y2 * c22.x - 2 * c10.y * c12x2 * c22.y + 2 * c20.x * c12y2 * c22.x - c11y2 * c12.x * c22.x - c11x2 * c12.y * c22.y + c21x2 * c12y2 + c12x2 * (2 * c20.y * c22.y + c21y2), 2 * c10.x * c12.x * c12.y * c21.y + 2 * c10.y * c12.x * c21.x * c12.y + c11.x * c11.y * c12.x * c21.y + c11.x * c11.y * c21.x * c12.y - 2 * c20.x * c12.x * c12.y * c21.y - 2 * c12.x * c20.y * c21.x * c12.y - 2 * c10.x * c21.x * c12y2 - 2 * c10.y * c12x2 * c21.y + 2 * c20.x * c21.x * c12y2 - c11y2 * c12.x * c21.x - c11x2 * c12.y * c21.y + 2 * c12x2 * c20.y * c21.y, -2 * c10.x * c10.y * c12.x * c12.y - c10.x * c11.x * c11.y * c12.y - c10.y * c11.x * c11.y * c12.x + 2 * c10.x * c12.x * c20.y * c12.y + 2 * c10.y * c20.x * c12.x * c12.y + c11.x * c20.x * c11.y * c12.y + c11.x * c11.y * c12.x * c20.y - 2 * c20.x * c12.x * c20.y * c12.y - 2 * c10.x * c20.x * c12y2 + c10.x * c11y2 * c12.x + c10.y * c11x2 * c12.y - 2 * c10.y * c12x2 * c20.y - c20.x * c11y2 * c12.x - c11x2 * c20.y * c12.y + c10x2 * c12y2 + c10y2 * c12x2 + c20x2 * c12y2 + c12x2 * c20y2); - var roots = poly.getRootsInInterval(0, 1); - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; - - try { - for (var _iterator4 = roots[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var s = _step4.value; - var xRoots = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x).getRoots(); - var yRoots = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y).getRoots(); - - if (xRoots.length > 0 && yRoots.length > 0) { - var TOLERANCE = 1e-4; - var _iteratorNormalCompletion5 = true; - var _didIteratorError5 = false; - var _iteratorError5 = undefined; - - try { - checkRoots: for (var _iterator5 = xRoots[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var xRoot = _step5.value; - - if (0 <= xRoot && xRoot <= 1) { - for (var k = 0; k < yRoots.length; k++) { - if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { - result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); - break checkRoots; - } - } - } - } - } catch (err) { - _didIteratorError5 = true; - _iteratorError5 = err; - } finally { - try { - if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { - _iterator5["return"](); - } - } finally { - if (_didIteratorError5) { - throw _iteratorError5; - } - } - } - } - } - } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; - } finally { - try { - if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { - _iterator4["return"](); - } - } finally { - if (_didIteratorError4) { - throw _iteratorError4; - } - } - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier2Circle - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} c - * @param {number} r - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Circle = function (p1, p2, p3, c, r) { - return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r); - }; - /** - * intersectBezier2Ellipse - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} ec - * @param {number} rx - * @param {number} ry - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Ellipse = function (p1, p2, p3, ec, rx, ry) { - var a; // temporary variables - // c2, c1, c0; // coefficients of quadratic - - var result = new Intersection("No Intersection"); - a = p2.multiply(-2); - var c2 = p1.add(a.add(p3)); - a = p1.multiply(-2); - var b = p2.multiply(2); - var c1 = a.add(b); - var c0 = new Point2D(p1.x, p1.y); - var rxrx = rx * rx; - var ryry = ry * ry; - var roots = new Polynomial(ryry * c2.x * c2.x + rxrx * c2.y * c2.y, 2 * (ryry * c2.x * c1.x + rxrx * c2.y * c1.y), ryry * (2 * c2.x * c0.x + c1.x * c1.x) + rxrx * (2 * c2.y * c0.y + c1.y * c1.y) - 2 * (ryry * ec.x * c2.x + rxrx * ec.y * c2.y), 2 * (ryry * c1.x * (c0.x - ec.x) + rxrx * c1.y * (c0.y - ec.y)), ryry * (c0.x * c0.x + ec.x * ec.x) + rxrx * (c0.y * c0.y + ec.y * ec.y) - 2 * (ryry * ec.x * c0.x + rxrx * ec.y * c0.y) - rxrx * ryry).getRoots(); - var _iteratorNormalCompletion6 = true; - var _didIteratorError6 = false; - var _iteratorError6 = undefined; - - try { - for (var _iterator6 = roots[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { - var t = _step6.value; - - if (0 <= t && t <= 1) { - result.points.push(c2.multiply(t * t).add(c1.multiply(t).add(c0))); - } - } - } catch (err) { - _didIteratorError6 = true; - _iteratorError6 = err; - } finally { - try { - if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { - _iterator6["return"](); - } - } finally { - if (_didIteratorError6) { - throw _iteratorError6; - } - } - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier2Line - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Line = function (p1, p2, p3, a1, a2) { - var a; // temporary variables - // let c2, c1, c0; // coefficients of quadratic - // cl; // c coefficient for normal form of line - // n; // normal for normal form of line - - var min = a1.min(a2); // used to determine if point is on line segment - - var max = a1.max(a2); // used to determine if point is on line segment - - var result = new Intersection("No Intersection"); - a = p2.multiply(-2); - var c2 = p1.add(a.add(p3)); - a = p1.multiply(-2); - var b = p2.multiply(2); - var c1 = a.add(b); - var c0 = new Point2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 - // Find normal to line: negative inverse of original line's slope - - var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient - - var cl = a1.x * a2.y - a2.x * a1.y; // Transform cubic coefficients to line's coordinate system and find roots - // of cubic - - var roots = new Polynomial(n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but - // might not be on the line segment. - // Find intersections and calculate point coordinates - - var _iteratorNormalCompletion7 = true; - var _didIteratorError7 = false; - var _iteratorError7 = undefined; - - try { - for (var _iterator7 = roots[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { - var t = _step7.value; - - if (0 <= t && t <= 1) { - // We're within the Bezier curve - // Find point on Bezier - var p4 = p1.lerp(p2, t); - var p5 = p2.lerp(p3, t); - var p6 = p4.lerp(p5, t); // See if point is on line segment - // Had to make special cases for vertical and horizontal lines due - // to slight errors in calculation of p6 - - if (a1.x == a2.x) { - if (min.y <= p6.y && p6.y <= max.y) { - result.status = "Intersection"; - result.appendPoint(p6); - } - } else if (a1.y == a2.y) { - if (min.x <= p6.x && p6.x <= max.x) { - result.status = "Intersection"; - result.appendPoint(p6); - } - } else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) { - result.status = "Intersection"; - result.appendPoint(p6); - } - } - } - } catch (err) { - _didIteratorError7 = true; - _iteratorError7 = err; - } finally { - try { - if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) { - _iterator7["return"](); - } - } finally { - if (_didIteratorError7) { - throw _iteratorError7; - } - } - } - - return result; - }; - /** - * intersectBezier2Polygon - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Polygon = function (p1, p2, p3, points) { - return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points)); - }; - /** - * intersectBezier2Polyline - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Polyline = function (p1, p2, p3, points) { - var result = new Intersection("No Intersection"); - var len = points.length; - - for (var i = 0; i < len - 1; i++) { - var a1 = points[i]; - var a2 = points[i + 1]; - var inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2); - result.appendPoints(inter.points); - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier2Rectangle - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} - */ - - - Intersection.intersectBezier2Rectangle = function (p1, p2, p3, r1, r2) { - var min = r1.min(r2); - var max = r1.max(r2); - var topRight = new Point2D(max.x, min.y); - var bottomLeft = new Point2D(min.x, max.y); - var inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight); - var inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max); - var inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft); - var inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min); - var result = new Intersection("No Intersection"); - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier3Bezier3 - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} a4 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} - */ - - - Intersection.intersectBezier3Bezier3 = function (a1, a2, a3, a4, b1, b2, b3, b4) { - var a, b, c, d; // temporary variables - // c13, c12, c11, c10; // coefficients of cubic - // c23, c22, c21, c20; // coefficients of cubic - - var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial - - a = a1.multiply(-1); - b = a2.multiply(3); - c = a3.multiply(-3); - d = a.add(b.add(c.add(a4))); - var c13 = new Vector2D(d.x, d.y); - a = a1.multiply(3); - b = a2.multiply(-6); - c = a3.multiply(3); - d = a.add(b.add(c)); - var c12 = new Vector2D(d.x, d.y); - a = a1.multiply(-3); - b = a2.multiply(3); - c = a.add(b); - var c11 = new Vector2D(c.x, c.y); - var c10 = new Vector2D(a1.x, a1.y); - a = b1.multiply(-1); - b = b2.multiply(3); - c = b3.multiply(-3); - d = a.add(b.add(c.add(b4))); - var c23 = new Vector2D(d.x, d.y); - a = b1.multiply(3); - b = b2.multiply(-6); - c = b3.multiply(3); - d = a.add(b.add(c)); - var c22 = new Vector2D(d.x, d.y); - a = b1.multiply(-3); - b = b2.multiply(3); - c = a.add(b); - var c21 = new Vector2D(c.x, c.y); - var c20 = new Vector2D(b1.x, b1.y); // bezout - - a = c13.x * c12.y - c12.x * c13.y; - b = c13.x * c11.y - c11.x * c13.y; - var c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; - var c1 = c21.x * c13.y - c13.x * c21.y; - var c2 = c22.x * c13.y - c13.x * c22.y; - var c3 = c23.x * c13.y - c13.x * c23.y; - d = c13.x * c11.y - c11.x * c13.y; - var e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; - var e1 = c21.x * c13.y - c13.x * c21.y; - var e2 = c22.x * c13.y - c13.x * c22.y; - var e3 = c23.x * c13.y - c13.x * c23.y; - var f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; - var f1 = c21.x * c12.y - c12.x * c21.y; - var f2 = c22.x * c12.y - c12.x * c22.y; - var f3 = c23.x * c12.y - c12.x * c23.y; - var g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; - var g1 = c21.x * c13.y - c13.x * c21.y; - var g2 = c22.x * c13.y - c13.x * c22.y; - var g3 = c23.x * c13.y - c13.x * c23.y; - var h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; - var h1 = c21.x * c12.y - c12.x * c21.y; - var h2 = c22.x * c12.y - c12.x * c22.y; - var h3 = c23.x * c12.y - c12.x * c23.y; - var i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y; - var i1 = c21.x * c11.y - c11.x * c21.y; - var i2 = c22.x * c11.y - c11.x * c22.y; - var i3 = c23.x * c11.y - c11.x * c23.y; // determinant - - var poly = new Polynomial(-c3 * e3 * g3, -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3, -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3, -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3, -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3, -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3, -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3, -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2, -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1, -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0); - poly.simplify(); - var roots = poly.getRootsInInterval(0, 1); - var _iteratorNormalCompletion8 = true; - var _didIteratorError8 = false; - var _iteratorError8 = undefined; - - try { - for (var _iterator8 = roots[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { - var s = _step8.value; - var xp = new Polynomial(c13.x, c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x); - xp.simplify(); - var xRoots = xp.getRoots(); - var yp = new Polynomial(c13.y, c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y); - yp.simplify(); - var yRoots = yp.getRoots(); - - if (xRoots.length > 0 && yRoots.length > 0) { - var TOLERANCE = 1e-4; - var _iteratorNormalCompletion9 = true; - var _didIteratorError9 = false; - var _iteratorError9 = undefined; - - try { - checkRoots: for (var _iterator9 = xRoots[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { - var xRoot = _step9.value; - - if (0 <= xRoot && xRoot <= 1) { - for (var k = 0; k < yRoots.length; k++) { - if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { - result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); - break checkRoots; - } - } - } - } - } catch (err) { - _didIteratorError9 = true; - _iteratorError9 = err; - } finally { - try { - if (!_iteratorNormalCompletion9 && _iterator9["return"] != null) { - _iterator9["return"](); - } - } finally { - if (_didIteratorError9) { - throw _iteratorError9; - } - } - } - } - } - } catch (err) { - _didIteratorError8 = true; - _iteratorError8 = err; - } finally { - try { - if (!_iteratorNormalCompletion8 && _iterator8["return"] != null) { - _iterator8["return"](); - } - } finally { - if (_didIteratorError8) { - throw _iteratorError8; - } - } - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier3Circle - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} c - * @param {number} r - * @returns {Intersection} - */ - - - Intersection.intersectBezier3Circle = function (p1, p2, p3, p4, c, r) { - return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r); - }; - /** - * intersectBezier3Ellipse - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} ec - * @param {number} rx - * @param {number} ry - * @returns {Intersection} - */ - - - Intersection.intersectBezier3Ellipse = function (p1, p2, p3, p4, ec, rx, ry) { - var a, b, c, d; // temporary variables - // c3, c2, c1, c0; // coefficients of cubic - - var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial - - a = p1.multiply(-1); - b = p2.multiply(3); - c = p3.multiply(-3); - d = a.add(b.add(c.add(p4))); - var c3 = new Vector2D(d.x, d.y); - a = p1.multiply(3); - b = p2.multiply(-6); - c = p3.multiply(3); - d = a.add(b.add(c)); - var c2 = new Vector2D(d.x, d.y); - a = p1.multiply(-3); - b = p2.multiply(3); - c = a.add(b); - var c1 = new Vector2D(c.x, c.y); - var c0 = new Vector2D(p1.x, p1.y); - var rxrx = rx * rx; - var ryry = ry * ry; - var poly = new Polynomial(c3.x * c3.x * ryry + c3.y * c3.y * rxrx, 2 * (c3.x * c2.x * ryry + c3.y * c2.y * rxrx), 2 * (c3.x * c1.x * ryry + c3.y * c1.y * rxrx) + c2.x * c2.x * ryry + c2.y * c2.y * rxrx, 2 * c3.x * ryry * (c0.x - ec.x) + 2 * c3.y * rxrx * (c0.y - ec.y) + 2 * (c2.x * c1.x * ryry + c2.y * c1.y * rxrx), 2 * c2.x * ryry * (c0.x - ec.x) + 2 * c2.y * rxrx * (c0.y - ec.y) + c1.x * c1.x * ryry + c1.y * c1.y * rxrx, 2 * c1.x * ryry * (c0.x - ec.x) + 2 * c1.y * rxrx * (c0.y - ec.y), c0.x * c0.x * ryry - 2 * c0.y * ec.y * rxrx - 2 * c0.x * ec.x * ryry + c0.y * c0.y * rxrx + ec.x * ec.x * ryry + ec.y * ec.y * rxrx - rxrx * ryry); - var roots = poly.getRootsInInterval(0, 1); - var _iteratorNormalCompletion10 = true; - var _didIteratorError10 = false; - var _iteratorError10 = undefined; - - try { - for (var _iterator10 = roots[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { - var t = _step10.value; - result.points.push(c3.multiply(t * t * t).add(c2.multiply(t * t).add(c1.multiply(t).add(c0)))); - } - } catch (err) { - _didIteratorError10 = true; - _iteratorError10 = err; - } finally { - try { - if (!_iteratorNormalCompletion10 && _iterator10["return"] != null) { - _iterator10["return"](); - } - } finally { - if (_didIteratorError10) { - throw _iteratorError10; - } - } - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier3Line - * - * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough - * sketch of the algorithm used here. Without his help, I'm not sure when I - * would have figured out this intersection problem. - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} - */ - - - Intersection.intersectBezier3Line = function (p1, p2, p3, p4, a1, a2) { - var a, b, c, d; // temporary variables - // c3, c2, c1, c0; // coefficients of cubic - // cl; // c coefficient for normal form of line - // n; // normal for normal form of line - - var min = a1.min(a2); // used to determine if point is on line segment - - var max = a1.max(a2); // used to determine if point is on line segment - - var result = new Intersection("No Intersection"); // Start with Bezier using Bernstein polynomials for weighting functions: - // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4 - // - // Expand and collect terms to form linear combinations of original Bezier - // controls. This ends up with a vector cubic in t: - // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1 - // /\ /\ /\ /\ - // || || || || - // c3 c2 c1 c0 - // Calculate the coefficients - - a = p1.multiply(-1); - b = p2.multiply(3); - c = p3.multiply(-3); - d = a.add(b.add(c.add(p4))); - var c3 = new Vector2D(d.x, d.y); - a = p1.multiply(3); - b = p2.multiply(-6); - c = p3.multiply(3); - d = a.add(b.add(c)); - var c2 = new Vector2D(d.x, d.y); - a = p1.multiply(-3); - b = p2.multiply(3); - c = a.add(b); - var c1 = new Vector2D(c.x, c.y); - var c0 = new Vector2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 - // Find normal to line: negative inverse of original line's slope - - var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient - - var cl = a1.x * a2.y - a2.x * a1.y; // ?Rotate each cubic coefficient using line for new coordinate system? - // Find roots of rotated cubic - - var roots = new Polynomial(n.dot(c3), n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but - // might not be on the line segment. - // Find intersections and calculate point coordinates - - var _iteratorNormalCompletion11 = true; - var _didIteratorError11 = false; - var _iteratorError11 = undefined; - - try { - for (var _iterator11 = roots[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { - var t = _step11.value; - - if (0 <= t && t <= 1) { - // We're within the Bezier curve - // Find point on Bezier - var p5 = p1.lerp(p2, t); - var p6 = p2.lerp(p3, t); - var p7 = p3.lerp(p4, t); - var p8 = p5.lerp(p6, t); - var p9 = p6.lerp(p7, t); - var p10 = p8.lerp(p9, t); // See if point is on line segment - // Had to make special cases for vertical and horizontal lines due - // to slight errors in calculation of p10 - - if (a1.x == a2.x) { - if (min.y <= p10.y && p10.y <= max.y) { - result.status = "Intersection"; - result.appendPoint(p10); - } - } else if (a1.y == a2.y) { - if (min.x <= p10.x && p10.x <= max.x) { - result.status = "Intersection"; - result.appendPoint(p10); - } - } else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) { - result.status = "Intersection"; - result.appendPoint(p10); - } - } - } - } catch (err) { - _didIteratorError11 = true; - _iteratorError11 = err; - } finally { - try { - if (!_iteratorNormalCompletion11 && _iterator11["return"] != null) { - _iterator11["return"](); - } - } finally { - if (_didIteratorError11) { - throw _iteratorError11; - } - } - } - - return result; - }; - /** - * intersectBezier3Polygon - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectBezier3Polygon = function (p1, p2, p3, p4, points) { - return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points)); - }; - /** - * intersectBezier3Polyline - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectBezier3Polyline = function (p1, p2, p3, p4, points) { - var result = new Intersection("No Intersection"); - var len = points.length; - - for (var i = 0; i < len - 1; i++) { - var a1 = points[i]; - var a2 = points[i + 1]; - var inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2); - result.appendPoints(inter.points); - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectBezier3Rectangle - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} - */ - - - Intersection.intersectBezier3Rectangle = function (p1, p2, p3, p4, r1, r2) { - var min = r1.min(r2); - var max = r1.max(r2); - var topRight = new Point2D(max.x, min.y); - var bottomLeft = new Point2D(min.x, max.y); - var inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight); - var inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max); - var inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft); - var inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min); - var result = new Intersection("No Intersection"); - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectCircleCircle - * - * @param {Point2D} c1 - * @param {number} r1 - * @param {Point2D} c2 - * @param {number} r2 - * @returns {Intersection} - */ - - - Intersection.intersectCircleCircle = function (c1, r1, c2, r2) { - var result; // Determine minimum and maximum radii where circles can intersect - - var r_max = r1 + r2; - var r_min = Math.abs(r1 - r2); // Determine actual distance between circle circles - - var c_dist = c1.distanceFrom(c2); - - if (c_dist > r_max) { - result = new Intersection("Outside"); - } else if (c_dist < r_min) { - result = new Intersection("Inside"); - } else { - result = new Intersection("Intersection"); - var a = (r1 * r1 - r2 * r2 + c_dist * c_dist) / (2 * c_dist); - var h = Math.sqrt(r1 * r1 - a * a); - var p = c1.lerp(c2, a / c_dist); - var b = h / c_dist; - result.points.push(new Point2D(p.x - b * (c2.y - c1.y), p.y + b * (c2.x - c1.x))); - result.points.push(new Point2D(p.x + b * (c2.y - c1.y), p.y - b * (c2.x - c1.x))); - } - - return result; - }; - /** - * intersectCircleEllipse - * - * @param {Point2D} cc - * @param {number} r - * @param {Point2D} ec - * @param {number} rx - * @param {number} ry - * @returns {Intersection} - */ - - - Intersection.intersectCircleEllipse = function (cc, r, ec, rx, ry) { - return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry); - }; - /** - * intersectCircleLine - * - * @param {Point2D} c - * @param {number} r - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} - */ - - - Intersection.intersectCircleLine = function (c, r, a1, a2) { - var result; - var a = (a2.x - a1.x) * (a2.x - a1.x) + (a2.y - a1.y) * (a2.y - a1.y); - var b = 2 * ((a2.x - a1.x) * (a1.x - c.x) + (a2.y - a1.y) * (a1.y - c.y)); - var cc = c.x * c.x + c.y * c.y + a1.x * a1.x + a1.y * a1.y - 2 * (c.x * a1.x + c.y * a1.y) - r * r; - var deter = b * b - 4 * a * cc; - - if (deter < 0) { - result = new Intersection("Outside"); - } else if (deter == 0) { - result = new Intersection("Tangent"); // NOTE: should calculate this point - } else { - var e = Math.sqrt(deter); - var u1 = (-b + e) / (2 * a); - var u2 = (-b - e) / (2 * a); - - if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) { - if (u1 < 0 && u2 < 0 || u1 > 1 && u2 > 1) { - result = new Intersection("Outside"); - } else { - result = new Intersection("Inside"); - } - } else { - result = new Intersection("Intersection"); - - if (0 <= u1 && u1 <= 1) { - result.points.push(a1.lerp(a2, u1)); - } - - if (0 <= u2 && u2 <= 1) { - result.points.push(a1.lerp(a2, u2)); - } - } - } - - return result; - }; - /** - * intersectCirclePolygon - * - * @param {Point2D} c - * @param {number} r - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectCirclePolygon = function (c, r, points) { - return this.intersectCirclePolyline(c, r, closePolygon(points)); - }; - /** - * intersectCirclePolyline - * - * @param {Point2D} c - * @param {number} r - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectCirclePolyline = function (c, r, points) { - var result = new Intersection("No Intersection"); - var len = points.length; - var inter; - - for (var i = 0; i < len - 1; i++) { - var a1 = points[i]; - var a2 = points[i + 1]; - inter = Intersection.intersectCircleLine(c, r, a1, a2); - result.appendPoints(inter.points); - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } else { - result.status = inter.status; - } - - return result; - }; - /** - * intersectCircleRectangle - * - * @param {Point2D} c - * @param {number} r - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} - */ - - - Intersection.intersectCircleRectangle = function (c, r, r1, r2) { - var min = r1.min(r2); - var max = r1.max(r2); - var topRight = new Point2D(max.x, min.y); - var bottomLeft = new Point2D(min.x, max.y); - var inter1 = Intersection.intersectCircleLine(c, r, min, topRight); - var inter2 = Intersection.intersectCircleLine(c, r, topRight, max); - var inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft); - var inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min); - var result = new Intersection("No Intersection"); - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = "Intersection"; - } else { - result.status = inter1.status; - } - - return result; - }; - /** - * intersectEllipseEllipse - * - * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His - * code along with many other excellent examples are avaiable at his site: - * http://www.magic-software.com - * - * NOTE: Rotation will need to be added to this function - * - * @param {Point2D} c1 - * @param {number} rx1 - * @param {number} ry1 - * @param {Point2D} c2 - * @param {number} rx2 - * @param {number} ry2 - * @returns {Intersection} - */ - - - Intersection.intersectEllipseEllipse = function (c1, rx1, ry1, c2, rx2, ry2) { - var a = [ry1 * ry1, 0, rx1 * rx1, -2 * ry1 * ry1 * c1.x, -2 * rx1 * rx1 * c1.y, ry1 * ry1 * c1.x * c1.x + rx1 * rx1 * c1.y * c1.y - rx1 * rx1 * ry1 * ry1]; - var b = [ry2 * ry2, 0, rx2 * rx2, -2 * ry2 * ry2 * c2.x, -2 * rx2 * rx2 * c2.y, ry2 * ry2 * c2.x * c2.x + rx2 * rx2 * c2.y * c2.y - rx2 * rx2 * ry2 * ry2]; - var yPoly = Intersection.bezout(a, b); - var yRoots = yPoly.getRoots(); - var epsilon = 1e-3; - var norm0 = (a[0] * a[0] + 2 * a[1] * a[1] + a[2] * a[2]) * epsilon; - var norm1 = (b[0] * b[0] + 2 * b[1] * b[1] + b[2] * b[2]) * epsilon; - var result = new Intersection("No Intersection"); - - for (var y = 0; y < yRoots.length; y++) { - var xPoly = new Polynomial(a[0], a[3] + yRoots[y] * a[1], a[5] + yRoots[y] * (a[4] + yRoots[y] * a[2])); - var xRoots = xPoly.getRoots(); - - for (var x = 0; x < xRoots.length; x++) { - var tst = (a[0] * xRoots[x] + a[1] * yRoots[y] + a[3]) * xRoots[x] + (a[2] * yRoots[y] + a[4]) * yRoots[y] + a[5]; - - if (Math.abs(tst) < norm0) { - tst = (b[0] * xRoots[x] + b[1] * yRoots[y] + b[3]) * xRoots[x] + (b[2] * yRoots[y] + b[4]) * yRoots[y] + b[5]; - - if (Math.abs(tst) < norm1) { - result.appendPoint(new Point2D(xRoots[x], yRoots[y])); - } - } - } - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectEllipseLine - * - * NOTE: Rotation will need to be added to this function - * - * @param {Point2D} c - * @param {number} rx - * @param {number} ry - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} - */ - - - Intersection.intersectEllipseLine = function (c, rx, ry, a1, a2) { - var result; - var orign = new Vector2D(a1.x, a1.y); - var dir = Vector2D.fromPoints(a1, a2); - var center = new Vector2D(c.x, c.y); - var diff = orign.subtract(center); - var mDir = new Vector2D(dir.x / (rx * rx), dir.y / (ry * ry)); - var mDiff = new Vector2D(diff.x / (rx * rx), diff.y / (ry * ry)); - var a = dir.dot(mDir); - var b = dir.dot(mDiff); - c = diff.dot(mDiff) - 1.0; - var d = b * b - a * c; - - if (d < 0) { - result = new Intersection("Outside"); - } else if (d > 0) { - var root = Math.sqrt(d); // eslint-disable-line no-shadow - - var t_a = (-b - root) / a; - var t_b = (-b + root) / a; - - if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) { - if (t_a < 0 && t_b < 0 || t_a > 1 && t_b > 1) { - result = new Intersection("Outside"); - } else { - result = new Intersection("Inside"); - } - } else { - result = new Intersection("Intersection"); - - if (0 <= t_a && t_a <= 1) { - result.appendPoint(a1.lerp(a2, t_a)); - } - - if (0 <= t_b && t_b <= 1) { - result.appendPoint(a1.lerp(a2, t_b)); - } - } - } else { - var t = -b / a; - - if (0 <= t && t <= 1) { - result = new Intersection("Intersection"); - result.appendPoint(a1.lerp(a2, t)); - } else { - result = new Intersection("Outside"); - } - } - - return result; - }; - /** - * intersectEllipsePolygon - * - * @param {Point2D} c - * @param {number} rx - * @param {number} ry - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectEllipsePolygon = function (c, rx, ry, points) { - return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points)); - }; - /** - * intersectEllipsePolyline - * - * @param {Point2D} c - * @param {number} rx - * @param {number} ry - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectEllipsePolyline = function (c, rx, ry, points) { - var result = new Intersection("No Intersection"); - var len = points.length; - - for (var i = 0; i < len - 1; i++) { - var b1 = points[i]; - var b2 = points[i + 1]; - var inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2); - result.appendPoints(inter.points); - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectEllipseRectangle - * - * @param {Point2D} c - * @param {number} rx - * @param {number} ry - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} - */ - - - Intersection.intersectEllipseRectangle = function (c, rx, ry, r1, r2) { - var min = r1.min(r2); - var max = r1.max(r2); - var topRight = new Point2D(max.x, min.y); - var bottomLeft = new Point2D(min.x, max.y); - var inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight); - var inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max); - var inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft); - var inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min); - var result = new Intersection("No Intersection"); - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectLineLine - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} - */ - - - Intersection.intersectLineLine = function (a1, a2, b1, b2) { - var result; - var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); - var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); - var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); - - if (u_b != 0) { - var ua = ua_t / u_b; - var ub = ub_t / u_b; - - if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { - result = new Intersection("Intersection"); - result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); - } else { - result = new Intersection("No Intersection"); - } - } else if (ua_t == 0 || ub_t == 0) { - result = new Intersection("Coincident"); - } else { - result = new Intersection("Parallel"); - } - - return result; - }; - /** - * intersectLinePolygon - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectLinePolygon = function (a1, a2, points) { - return this.intersectLinePolyline(a1, a2, closePolygon(points)); - }; - /** - * intersectLinePolyline - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} - */ - - - Intersection.intersectLinePolyline = function (a1, a2, points) { - var result = new Intersection("No Intersection"); - var len = points.length; - - for (var i = 0; i < len - 1; i++) { - var b1 = points[i]; - var b2 = points[i + 1]; - var inter = Intersection.intersectLineLine(a1, a2, b1, b2); - result.appendPoints(inter.points); - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectLineRectangle - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} - */ - - - Intersection.intersectLineRectangle = function (a1, a2, r1, r2) { - var min = r1.min(r2); - var max = r1.max(r2); - var topRight = new Point2D(max.x, min.y); - var bottomLeft = new Point2D(min.x, max.y); - var inter1 = Intersection.intersectLineLine(min, topRight, a1, a2); - var inter2 = Intersection.intersectLineLine(topRight, max, a1, a2); - var inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2); - var inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2); - var result = new Intersection("No Intersection"); - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectPolygonPolygon - * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} - */ - - - Intersection.intersectPolygonPolygon = function (points1, points2) { - return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2)); - }; - /** - * intersectPolygonPolyline - * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} - */ - - - Intersection.intersectPolygonPolyline = function (points1, points2) { - return this.intersectPolylinePolyline(closePolygon(points1), points2); - }; - /** - * intersectPolygonRectangle - * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} - */ - - - Intersection.intersectPolygonRectangle = function (points, r1, r2) { - return this.intersectPolylineRectangle(closePolygon(points), r1, r2); - }; - /** - * intersectPolylinePolyline - * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} - */ - - - Intersection.intersectPolylinePolyline = function (points1, points2) { - var result = new Intersection("No Intersection"); - var len = points1.length; - - for (var i = 0; i < len - 1; i++) { - var a1 = points1[i]; - var a2 = points1[i + 1]; - var inter = Intersection.intersectLinePolyline(a1, a2, points2); - result.appendPoints(inter.points); - } - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectPolylineRectangle - * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} - */ - - - Intersection.intersectPolylineRectangle = function (points, r1, r2) { - var min = r1.min(r2); - var max = r1.max(r2); - var topRight = new Point2D(max.x, min.y); - var bottomLeft = new Point2D(min.x, max.y); - var inter1 = Intersection.intersectLinePolyline(min, topRight, points); - var inter2 = Intersection.intersectLinePolyline(topRight, max, points); - var inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points); - var inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points); - var result = new Intersection("No Intersection"); - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectRectangleRectangle - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} - */ - - - Intersection.intersectRectangleRectangle = function (a1, a2, b1, b2) { - var min = a1.min(a2); - var max = a1.max(a2); - var topRight = new Point2D(max.x, min.y); - var bottomLeft = new Point2D(min.x, max.y); - var inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2); - var inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2); - var inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2); - var inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2); - var result = new Intersection("No Intersection"); - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = "Intersection"; - } - - return result; - }; - /** - * intersectRayRay - * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} - */ - - - Intersection.intersectRayRay = function (a1, a2, b1, b2) { - var result; - var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); - var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); - var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); - - if (u_b != 0) { - var ua = ua_t / u_b; - result = new Intersection("Intersection"); - result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); - } else if (ua_t == 0 || ub_t == 0) { - result = new Intersection("Coincident"); - } else { - result = new Intersection("Parallel"); - } - - return result; - }; - /** - * bezout - * - * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His - * code along with many other excellent examples are avaiable at his site: - * http://www.magic-software.com - * - * @param {Array} e1 - * @param {Array} e2 - * @returns {Polynomial} - */ - - - Intersection.bezout = function (e1, e2) { - var AB = e1[0] * e2[1] - e2[0] * e1[1]; - var AC = e1[0] * e2[2] - e2[0] * e1[2]; - var AD = e1[0] * e2[3] - e2[0] * e1[3]; - var AE = e1[0] * e2[4] - e2[0] * e1[4]; - var AF = e1[0] * e2[5] - e2[0] * e1[5]; - var BC = e1[1] * e2[2] - e2[1] * e1[2]; - var BE = e1[1] * e2[4] - e2[1] * e1[4]; - var BF = e1[1] * e2[5] - e2[1] * e1[5]; - var CD = e1[2] * e2[3] - e2[2] * e1[3]; - var DE = e1[3] * e2[4] - e2[3] * e1[4]; - var DF = e1[3] * e2[5] - e2[3] * e1[5]; - var BFpDE = BF + DE; - var BEmCD = BE - CD; - return new Polynomial(AB * BC - AC * AC, AB * BEmCD + AD * BC - 2 * AC * AE, AB * BFpDE + AD * BEmCD - AE * AE - 2 * AC * AF, AB * DF + AD * BFpDE - 2 * AE * AF, AD * DF - AF * AF); - }; - - /** - * - * IntersectionArgs.js - * - * @copyright 2002, 2017 Kevin Lindsey - * - */ - - /** - * IntersectionArgs - * - * @param {string} name - * @param {Array} args - * @returns {IntersectionArgs} - */ - function IntersectionArgs(name, args) { - this.init(name, args); - } - /** - * init - * - * @param {string} name - * @param {Array} args - */ - - - IntersectionArgs.prototype.init = function (name, args) { - this.name = name; - this.args = args; - }; - - /** - * Shapes - * - * @copyright 2017, Kevin Lindsey - */ - var Shapes = {}; - /** - * quadraticBezier - * - * @param {number} p1x - * @param {number} p1y - * @param {number} p2x - * @param {number} p2y - * @param {number} p3x - * @param {number} p3y - * @returns {IntersectionArgs} - */ - - Shapes.quadraticBezier = function (p1x, p1y, p2x, p2y, p3x, p3y) { - return new IntersectionArgs("Bezier2", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y)]); - }; - /** - * cubicBezier - * - * @param {number} p1x - * @param {number} p1y - * @param {number} p2x - * @param {number} p2y - * @param {number} p3x - * @param {number} p3y - * @param {number} p4x - * @param {number} p4y - * @returns {IntersectionArgs} - */ - - - Shapes.cubicBezier = function (p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { - return new IntersectionArgs("Bezier3", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y), new Point2D(p4x, p4y)]); - }; - /** - * circle - * - * @param {number} centerX - * @param {number} centerY - * @param {number} radius - * @returns {IntersectionArgs} - */ - - - Shapes.circle = function (centerX, centerY, radius) { - return new IntersectionArgs("Circle", [new Point2D(centerX, centerY), radius]); - }; - /** - * ellipse - * - * @param {number} centerX - * @param {number} centerY - * @param {number} radiusX - * @param {number} radiusY - * @returns {IntersectionArgs} - */ - - - Shapes.ellipse = function (centerX, centerY, radiusX, radiusY) { - return new IntersectionArgs("Ellipse", [new Point2D(centerX, centerY), radiusX, radiusY]); - }; - /** - * line - * - * @param {number} p1x - * @param {number} p1y - * @param {number} p2x - * @param {number} p2y - * @returns {IntersectionArgs} - */ - - - Shapes.line = function (p1x, p1y, p2x, p2y) { - return new IntersectionArgs("Line", [new Point2D(p1x, p1y), new Point2D(p2x, p2y)]); - }; - /** - * path - * - * @param {Array} segments - * @returns {IntersectionArgs} - */ - - - Shapes.path = function (segments) { - return new IntersectionArgs("Path", segments); - }; - /** - * polygon - * - * @param {Array} coords - * @returns {IntersectionArgs} - */ - - - Shapes.polygon = function (coords) { - var points = []; - - for (var i = 0; i < coords.length; i += 2) { - points.push(new Point2D(coords[i], coords[i + 1])); - } - - return new IntersectionArgs("Polygon", [points]); - }; - /** - * polyline - * - * @param {Array} coords - * @returns {IntersectionArgs} - */ - - - Shapes.polyline = function (coords) { - var points = []; - - for (var i = 0; i < coords.length; i += 2) { - points.push(new Point2D(coords[i], coords[i + 1])); - } - - return new IntersectionArgs("Polyline", [points]); - }; - /** - * rectangle - * - * @param {number} x - * @param {number} y - * @param {number} width - * @param {number} height - * @returns {IntersectionArgs} - */ - - - Shapes.rectangle = function (x, y, width, height) { - return new IntersectionArgs("Rectangle", [new Point2D(x, y), new Point2D(x + width, y + height)]); - }; - - /** - * AffineShapes - * - * @copyright 2017, Kevin Lindsey - */ - var AffineShapes = {}; - /** - * quadraticBezier - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @returns {IntersectionArgs} - */ - - AffineShapes.quadraticBezier = function (p1, p2, p3) { - return new IntersectionArgs("Bezier2", [p1, p2, p3]); - }; - /** - * cubicBezier - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @returns {IntersectionArgs} - */ - - - AffineShapes.cubicBezier = function (p1, p2, p3, p4) { - return new IntersectionArgs("Bezier3", [p1, p2, p3, p4]); - }; - /** - * circle - * - * @param {Point2D} center - * @param {number} radius - * @returns {IntersectionArgs} - */ - - - AffineShapes.circle = function (center, radius) { - return new IntersectionArgs("Circle", [center, radius]); - }; - /** - * ellipse - * - * @param {Point2D} center - * @param {number} radiusX - * @param {number} radiusY - * @returns {IntersectionArgs} - */ - - - AffineShapes.ellipse = function (center, radiusX, radiusY) { - return new IntersectionArgs("Ellipse", [center, radiusX, radiusY]); - }; - /** - * line - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @returns {IntersectionArgs} - */ - - - AffineShapes.line = function (p1, p2) { - return new IntersectionArgs("Line", [p1, p2]); - }; - /** - * path - * - * @param {Array} segments - * @returns {IntersectionArgs} - */ - - - AffineShapes.path = function (segments) { - return new IntersectionArgs("Path", [segments]); - }; - /** - * polygon - * - * @param {Array} points - * @returns {IntersectionArgs} - */ - - - AffineShapes.polygon = function (points) { - return new IntersectionArgs("Polygon", [points]); - }; - /** - * polyline - * - * @param {Array} points - * @returns {IntersectionArgs} - */ - - - AffineShapes.polyline = function (points) { - return new IntersectionArgs("Polyline", [points]); - }; - /** - * rectangle - * - * @param {Point2D} topLeft - * @param {Vector2D} size - * @returns {IntersectionArgs} - */ - - - AffineShapes.rectangle = function (topLeft, size) { - return new IntersectionArgs("Rectangle", [topLeft, topLeft.add(size)]); - }; - - /** - * - * IntersectionQuery.js - * - * @copyright 2017 Kevin Lindsey - * - */ - /** - * - */ - - var IntersectionQuery = {}; - /** - * pointInCircle - * - * @param {Point2D} point - * @param {Point2D} center - * @param {number} radius - * @returns {boolean} - */ - - IntersectionQuery.pointInCircle = function (point, center, radius) { - var v = Vector2D.fromPoints(center, point); - return v.length() <= radius; - }; - /** - * pointInEllipse - * - * @param {Point2D} point - * @param {Point2D} center - * @param {number} radiusX - * @param {number} radiusY - * @returns {boolean} - */ - - - IntersectionQuery.pointInEllipse = function (point, center, radiusX, radiusY) { - var len = point.subtract(center); - return len.x * len.x / (radiusX * radiusX) + len.y * len.y / (radiusY * radiusY) <= 1; - }; - /** - * pointInPolyline - * - * @param {Point2D} point - * @param {Array} points - */ - - - IntersectionQuery.pointInPolyline = function (point, points) { - var len = points.length; - var counter = 0; - var xInter; - var p1 = points[0]; - - for (var i = 1; i <= len; i++) { - var p2 = points[i % len]; - var minY = Math.min(p1.y, p2.y); - var maxY = Math.max(p1.y, p2.y); - var maxX = Math.max(p1.x, p2.x); - - if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) { - xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x; - - if (p1.x === p2.x || point.x <= xInter) { - counter++; - } - } - - p1 = p2; - } - - return counter % 2 === 1; - }; - /** - * pointInPolyline - * - * @param {Point2D} point - * @param {Array} points - */ - - - IntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline; - /** - * pointInRectangle - * - * @param {Point2D} point - * @param {Point2D} topLeft - * @param {Point2D} bottomRight - * @returns {boolean} - */ - - IntersectionQuery.pointInRectangle = function (point, topLeft, bottomRight) { - return topLeft.x <= point.x && point.x < bottomRight.x && topLeft.y <= point.y && point.y < bottomRight.y; - }; - - // expose module classes - - exports.AffineShapes = AffineShapes; - exports.Intersection = Intersection; - exports.IntersectionArgs = IntersectionArgs; - exports.IntersectionQuery = IntersectionQuery; - exports.Matrix2D = Matrix2D; - exports.Point2D = Point2D; - exports.Shapes = Shapes; - exports.Vector2D = Vector2D; - - Object.defineProperty(exports, '__esModule', { value: true }); + case 3: + result = this.getCubicRoots(); + break; + + case 4: + result = this.getQuarticRoots(); + break; + + default: + result = []; + } + + return result; + }; + /** + * getRootsInInterval + */ + + + Polynomial.prototype.getRootsInInterval = function (min, max) { + var roots = new Array(); + var root; + + if (this.getDegree() == 1) { + root = this.bisection(min, max); + + if (root != null) { + roots.push(root); + } + } else { + // get roots of derivative + var deriv = this.getDerivative(); + var droots = deriv.getRootsInInterval(min, max); + + if (droots.length > 0) { + // find root on [min, droots[0]] + root = this.bisection(min, droots[0]); + + if (root != null) { + roots.push(root); + } // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2 + + + for (i = 0; i <= droots.length - 2; i++) { + root = this.bisection(droots[i], droots[i + 1]); + + if (root != null) { + roots.push(root); + } + } // find root on [droots[count-1],xmax] + + + root = this.bisection(droots[droots.length - 1], max); + + if (root != null) { + roots.push(root); + } + } else { + // polynomial is monotone on [min,max], has at most one root + root = this.bisection(min, max); + + if (root != null) { + roots.push(root); + } + } + } + + return roots; + }; + /** + * getLinearRoot + */ + + + Polynomial.prototype.getLinearRoot = function () { + var result = []; + var a = this.coefs[1]; + + if (a != 0) { + result.push(-this.coefs[0] / a); + } + + return result; + }; + /** + * getQuadraticRoots + */ + + + Polynomial.prototype.getQuadraticRoots = function () { + var results = []; + + if (this.getDegree() == 2) { + var a = this.coefs[2]; + var b = this.coefs[1] / a; + var c = this.coefs[0] / a; + var d = b * b - 4 * c; + + if (d > 0) { + var e = Math.sqrt(d); + results.push(0.5 * (-b + e)); + results.push(0.5 * (-b - e)); + } else if (d == 0) { + // really two roots with same value, but we only return one + results.push(0.5 * -b); + } + } + + return results; + }; + /** + * getCubicRoots + * + * This code is based on MgcPolynomial.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.geometrictools.com + */ + + + Polynomial.prototype.getCubicRoots = function () { + var results = []; + + if (this.getDegree() == 3) { + var c3 = this.coefs[3]; + var c2 = this.coefs[2] / c3; + var c1 = this.coefs[1] / c3; + var c0 = this.coefs[0] / c3; + var a = (3 * c1 - c2 * c2) / 3; + var b = (2 * c2 * c2 * c2 - 9 * c1 * c2 + 27 * c0) / 27; + var offset = c2 / 3; + var discrim = b * b / 4 + a * a * a / 27; + var halfB = b / 2; + var ZEROepsilon = this.zeroErrorEstimate(); + + if (Math.abs(discrim) <= ZEROepsilon) { + discrim = 0; + } + + if (discrim > 0) { + var e = Math.sqrt(discrim); + var tmp; + var root; + tmp = -halfB + e; + + if (tmp >= 0) { + root = Math.pow(tmp, 1 / 3); + } else { + root = -Math.pow(-tmp, 1 / 3); + } + + tmp = -halfB - e; + + if (tmp >= 0) { + root += Math.pow(tmp, 1 / 3); + } else { + root -= Math.pow(-tmp, 1 / 3); + } + + results.push(root - offset); + } else if (discrim < 0) { + var distance = Math.sqrt(-a / 3); + var angle = Math.atan2(Math.sqrt(-discrim), -halfB) / 3; + var cos = Math.cos(angle); + var sin = Math.sin(angle); + var sqrt3 = Math.sqrt(3); + results.push(2 * distance * cos - offset); + results.push(-distance * (cos + sqrt3 * sin) - offset); + results.push(-distance * (cos - sqrt3 * sin) - offset); + } else { + var tmp; + + if (halfB >= 0) { + tmp = -Math.pow(halfB, 1 / 3); + } else { + tmp = Math.pow(-halfB, 1 / 3); + } + + results.push(2 * tmp - offset); // really should return next root twice, but we return only one + + results.push(-tmp - offset); + } + } + + return results; + }; + /** + * Sign of a number (+1, -1, +0, -0). + */ + + + var sign = function sign(x) { + return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN; + }; + /** + * Calculates roots of quartic polynomial.
+ * First, derivative roots are found, then used to split quartic polynomial + * into segments, each containing one root of quartic polynomial. + * Segments are then passed to newton's method to find roots. + * + * @returns {Array} roots + */ + + + Polynomial.prototype.getQuarticRoots = function () { + var results = []; + var n = this.getDegree(); + + if (n == 4) { + var poly = new Polynomial(); + poly.coefs = this.coefs.slice(); + poly.divide_scalar(poly.coefs[n]); + var ERRF = 1e-15; + + if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) { + poly.coefs[0] = 0; + } + + var poly_d = poly.getDerivative(); + var derrt = poly_d.getRoots().sort(function (a, b) { + return a - b; + }); + var dery = []; + var nr = derrt.length - 1; + var i; + var rb = this.bounds(); + maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); + var ZEROepsilon = this.zeroErrorEstimate(maxabsX); + + for (i = 0; i <= nr; i++) { + dery.push(poly.eval(derrt[i])); + } + + for (i = 0; i <= nr; i++) { + if (Math.abs(dery[i]) < ZEROepsilon) { + dery[i] = 0; + } + } + + i = 0; + var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF); + var guesses = []; + var minmax = []; + + if (nr > -1) { + if (dery[0] != 0) { + if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) { + guesses.push(derrt[0] - dx); + minmax.push([rb.minX, derrt[0]]); + } + } else { + results.push(derrt[0], derrt[0]); + i++; + } + + for (; i < nr; i++) { + if (dery[i + 1] == 0) { + results.push(derrt[i + 1], derrt[i + 1]); + i++; + } else if (sign(dery[i]) != sign(dery[i + 1])) { + guesses.push((derrt[i] + derrt[i + 1]) / 2); + minmax.push([derrt[i], derrt[i + 1]]); + } + } + + if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) { + guesses.push(derrt[nr] + dx); + minmax.push([derrt[nr], rb.maxX]); + } + } + + var f = function f(x) { + return poly.eval(x); + }; + + var df = function df(x) { + return poly_d.eval(x); + }; + + if (guesses.length > 0) { + for (i = 0; i < guesses.length; i++) { + guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]); + } + } + + results = results.concat(guesses); + } + + return results; + }; + /** + * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0. + * + * @returns {Number} + */ + + + Polynomial.prototype.zeroErrorEstimate = function (maxabsX) { + var poly = this; + var ERRF = 1e-15; + + if (typeof maxabsX === 'undefined') { + var rb = poly.bounds(); + maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX)); + } + + if (maxabsX < 0.001) { + return 2 * Math.abs(poly.eval(ERRF)); + } + + var n = poly.coefs.length - 1; + var an = poly.coefs[n]; + return 10 * ERRF * poly.coefs.reduce(function (m, v, i) { + var nm = v / an * Math.pow(maxabsX, i); + return nm > m ? nm : m; + }, 0); + }; + /** + * Calculates upper Real roots bounds.
+ * Real roots are in interval [negX, posX]. Determined by Fujiwara method. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ negX: Number, posX: Number }} + */ + + + Polynomial.prototype.bounds_UpperReal_Fujiwara = function () { + var a = this.coefs; + var n = a.length - 1; + var an = a[n]; + + if (an != 1) { + a = this.coefs.map(function (v) { + return v / an; + }); + } + + var b = a.map(function (v, i) { + return i < n ? Math.pow(Math.abs(i == 0 ? v / 2 : v), 1 / (n - i)) : v; + }); + var coefSelectionFunc; + + var find2Max = function find2Max(acc, bi, i) { + if (coefSelectionFunc(i)) { + if (acc.max < bi) { + acc.nearmax = acc.max; + acc.max = bi; + } else if (acc.nearmax < bi) { + acc.nearmax = bi; + } + } + + return acc; + }; + + coefSelectionFunc = function coefSelectionFunc(i) { + return i < n && a[i] < 0; + }; + + var max_nearmax_pos = b.reduce(find2Max, { + max: 0, + nearmax: 0 + }); + + coefSelectionFunc = function coefSelectionFunc(i) { + return i < n && (n % 2 == i % 2 ? a[i] < 0 : a[i] > 0); + }; + + var max_nearmax_neg = b.reduce(find2Max, { + max: 0, + nearmax: 0 + }); + return { + negX: -2 * max_nearmax_neg.max, + posX: 2 * max_nearmax_pos.max + }; + }; + /** + * Calculates lower Real roots bounds.
+ * There are no Real roots in interval . Determined by Fujiwara method. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ negX: Number, posX: Number }} + */ + + + Polynomial.prototype.bounds_LowerReal_Fujiwara = function () { + var poly = new Polynomial(); + poly.coefs = this.coefs.slice().reverse(); + var res = poly.bounds_UpperReal_Fujiwara(); + res.negX = 1 / res.negX; + res.posX = 1 / res.posX; + return res; + }; + /** + * Calculates left and right Real roots bounds.
+ * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval. + * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots} + * + * @returns {{ minX: Number, maxX: Number }} + */ + + + Polynomial.prototype.bounds = function () { + var urb = this.bounds_UpperReal_Fujiwara(); + var rb = { + minX: urb.negX, + maxX: urb.posX + }; + + if (urb.negX === 0 && urb.posX === 0) { + return rb; + } + + if (urb.negX === 0) { + rb.minX = this.bounds_LowerReal_Fujiwara().posX; + } else if (urb.posX === 0) { + rb.maxX = this.bounds_LowerReal_Fujiwara().negX; + } + + if (rb.minX > rb.maxX) { + //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?'); + rb.minX = rb.maxX = 0; + } + + return rb; // TODO: if sure that there are no complex roots + // (maybe by using Sturm's theorem) use: + // return this.bounds_Real_Laguerre(); + }; + /** + * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
+ * When using bounds, algorithm falls back to secant if newton goes out of range. + * Bisection is fallback for secant when determined secant is not efficient enough. + * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method} + * @see {@link http://en.wikipedia.org/wiki/Secant_method} + * @see {@link http://en.wikipedia.org/wiki/Bisection_method} + * + * @param {Number} x0 - Inital root guess + * @param {function(x)} f - Function which root we are trying to find + * @param {function(x)} df - Derivative of function f + * @param {Number} max_iterations - Maximum number of algorithm iterations + * @param {Number} [min_x] - Left bound value + * @param {Number} [max_x] - Right bound value + * @returns {Number} - root + */ + + + Polynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) { + var x, + prev_dfx = 0, + dfx, + prev_x_ef_correction = 0, + x_correction, + x_new; + var y_atmin, y_atmax; + x = x0; + var ACCURACY = 14; + var min_correction_factor = Math.pow(10, -ACCURACY); + var isBounded = typeof min === 'number' && typeof max === 'number'; + + if (isBounded) { + if (min > max) { + throw new Error("newton root finding: min must be greater than max"); + } + + y_atmin = f(min); + y_atmax = f(max); + + if (sign(y_atmin) == sign(y_atmax)) { + throw new Error("newton root finding: y values of bounds must be of opposite sign"); + } + } + + var isEnoughCorrection = function isEnoughCorrection() { + // stop if correction is too small or if correction is in simple loop + return Math.abs(x_correction) <= min_correction_factor * Math.abs(x) || prev_x_ef_correction == x - x_correction - x; + }; + + var i; + + for (i = 0; i < max_iterations; i++) { + dfx = df(x); + + if (dfx == 0) { + if (prev_dfx == 0) { + // error + throw new Error("newton root finding: df(x) is zero"); + } else { + // use previous derivation value + dfx = prev_dfx; + } // or move x a little? + //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15); + + } + + prev_dfx = dfx; + y = f(x); + x_correction = y / dfx; + x_new = x - x_correction; + + if (isEnoughCorrection()) { + break; + } + + if (isBounded) { + if (sign(y) == sign(y_atmax)) { + max = x; + y_atmax = y; + } else if (sign(y) == sign(y_atmin)) { + min = x; + y_atmin = y; + } else { + x = x_new; + break; + } + + if (x_new < min || x_new > max) { + if (sign(y_atmin) == sign(y_atmax)) { + break; + } + + var RATIO_LIMIT = 50; + var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5) + + var dy = y_atmax - y_atmin; + var dx = max - min; + + if (dy == 0) { + x_correction = x - (min + dx * 0.5); + } else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) { + x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET))); + } else { + x_correction = x - (min - y_atmin / dy * dx); + } + + x_new = x - x_correction; + + if (isEnoughCorrection()) { + break; + } + } + } + + prev_x_ef_correction = x - x_new; + x = x_new; + } + + return x; + }; + + { + module.exports = Polynomial; + } + }); + + var SqrtPolynomial_1 = createCommonjsModule(function (module) { + /** + * + * SqrtPolynomial.js + * + * copyright 2003, 2013 Kevin Lindsey + * + */ + { + var Polynomial = Polynomial_1; + } + /** + * class variables + */ + + + SqrtPolynomial.VERSION = 1.0; // setup inheritance + + SqrtPolynomial.prototype = new Polynomial(); + SqrtPolynomial.prototype.constructor = SqrtPolynomial; + SqrtPolynomial.superclass = Polynomial.prototype; + /** + * SqrtPolynomial + */ + + function SqrtPolynomial() { + this.init(arguments); + } + /** + * eval + * + * @param {Number} x + * @returns {Number} + */ + + + SqrtPolynomial.prototype.eval = function (x) { + var TOLERANCE = 1e-7; + var result = SqrtPolynomial.superclass.eval.call(this, x); // NOTE: May need to change the following. I added these to capture + // some really small negative values that were being generated by one + // of my Bezier arcLength functions + + if (Math.abs(result) < TOLERANCE) result = 0; + if (result < 0) throw new Error("SqrtPolynomial.eval: cannot take square root of negative number"); + return Math.sqrt(result); + }; + + SqrtPolynomial.prototype.toString = function () { + var result = SqrtPolynomial.superclass.toString.call(this); + return "sqrt(" + result + ")"; + }; + + { + module.exports = SqrtPolynomial; + } + }); + + // expose classes + var Polynomial = Polynomial_1; + + /** + * + * @param {*} o + * @returns {boolean} + */ + + function isNullish(o) { + return o === null || o === undefined; + } + /** + * closePolygon + * + * @param {Array} points + * @returns {Array} + */ + + + function closePolygon(points) { + var copy = points.slice(); + copy.push(points[0]); + return copy; + } + /** + * Intersection + */ + + + var Intersection = + /*#__PURE__*/ + function () { + /** + * @param {string} status + */ + function Intersection(status) { + _classCallCheck(this, Intersection); + + this.init(status); + } + /** + * init + * + * @param {string} status + * @returns {Intersection} + */ + + + _createClass(Intersection, [{ + key: "init", + value: function init(status) { + this.status = status; + this.points = []; + } + /** + * appendPoint + * + * @param {Point2D} point + */ + + }, { + key: "appendPoint", + value: function appendPoint(point) { + this.points.push(point); + } + /** + * appendPoints + * + * @param {Array} points + */ + + }, { + key: "appendPoints", + value: function appendPoints(points) { + this.points = this.points.concat(points); + } + }]); + + return Intersection; + }(); // static methods + + /** + * intersect + * + * @param {IntersectionArgs} shape1 + * @param {IntersectionArgs} shape2 + * @returns {Intersection} + */ + + + Intersection.intersect = function (shape1, shape2) { + var result; + + if (!isNullish(shape1) && !isNullish(shape2)) { + if (shape1.name === "Path") { + result = Intersection.intersectPathShape(shape1, shape2); + } else if (shape2.name === "Path") { + result = Intersection.intersectPathShape(shape2, shape1); + } else { + var method; + var args; + + if (shape1.name < shape2.name) { + method = "intersect" + shape1.name + shape2.name; + args = shape1.args.concat(shape2.args); + } else { + method = "intersect" + shape2.name + shape1.name; + args = shape2.args.concat(shape1.args); + } + + if (!(method in Intersection)) { + throw new Error("Intersection not available: " + method); + } + + result = Intersection[method].apply(null, args); + } + } else { + result = new Intersection("No Intersection"); + } + + return result; + }; + /** + * intersectPathShape + * + * @param {IntersectionArgs} path + * @param {IntersectionArgs} shape + * @returns {Intersection} + */ + + + Intersection.intersectPathShape = function (path, shape) { + var result = new Intersection("No Intersection"); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = path.args[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var segment = _step.value; + var inter = Intersection.intersect(segment, shape); + result.appendPoints(inter.points); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Bezier2 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Bezier2 = function (a1, a2, a3, b1, b2, b3) { + var a, b; + var result = new Intersection("No Intersection"); + a = a2.multiply(-2); + var c12 = a1.add(a.add(a3)); + a = a1.multiply(-2); + b = a2.multiply(2); + var c11 = a.add(b); + var c10 = new Point2D(a1.x, a1.y); + a = b2.multiply(-2); + var c22 = b1.add(a.add(b3)); + a = b1.multiply(-2); + b = b2.multiply(2); + var c21 = a.add(b); + var c20 = new Point2D(b1.x, b1.y); // bezout + + a = c12.x * c11.y - c11.x * c12.y; + b = c22.x * c11.y - c11.x * c22.y; + var c = c21.x * c11.y - c11.x * c21.y; + var d = c11.x * (c10.y - c20.y) + c11.y * (-c10.x + c20.x); + var e = c22.x * c12.y - c12.x * c22.y; + var f = c21.x * c12.y - c12.x * c21.y; + var g = c12.x * (c10.y - c20.y) + c12.y * (-c10.x + c20.x); // determinant + + var poly = new Polynomial(-e * e, -2 * e * f, a * b - f * f - 2 * e * g, a * c - 2 * f * g, a * d - g * g); + var roots = poly.getRoots(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = roots[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var s = _step2.value; + + if (0 <= s && s <= 1) { + var xp = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x); + xp.simplify(); + var xRoots = xp.getRoots(); + var yp = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y); + yp.simplify(); + var yRoots = yp.getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + checkRoots: for (var _iterator3 = xRoots[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var xRoot = _step3.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c22.multiply(s * s).add(c21.multiply(s).add(c20))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + } + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Bezier3 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @param {Point2D} b4 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Bezier3 = function (a1, a2, a3, b1, b2, b3, b4) { + var a, b, c, d; + var result = new Intersection("No Intersection"); + a = a2.multiply(-2); + var c12 = a1.add(a.add(a3)); + a = a1.multiply(-2); + b = a2.multiply(2); + var c11 = a.add(b); + var c10 = new Point2D(a1.x, a1.y); + a = b1.multiply(-1); + b = b2.multiply(3); + c = b3.multiply(-3); + d = a.add(b.add(c.add(b4))); + var c23 = new Vector2D(d.x, d.y); + a = b1.multiply(3); + b = b2.multiply(-6); + c = b3.multiply(3); + d = a.add(b.add(c)); + var c22 = new Vector2D(d.x, d.y); + a = b1.multiply(-3); + b = b2.multiply(3); + c = a.add(b); + var c21 = new Vector2D(c.x, c.y); + var c20 = new Vector2D(b1.x, b1.y); + var c10x2 = c10.x * c10.x; + var c10y2 = c10.y * c10.y; + var c11x2 = c11.x * c11.x; + var c11y2 = c11.y * c11.y; + var c12x2 = c12.x * c12.x; + var c12y2 = c12.y * c12.y; + var c20x2 = c20.x * c20.x; + var c20y2 = c20.y * c20.y; + var c21x2 = c21.x * c21.x; + var c21y2 = c21.y * c21.y; + var c22x2 = c22.x * c22.x; + var c22y2 = c22.y * c22.y; + var c23x2 = c23.x * c23.x; + var c23y2 = c23.y * c23.y; + var poly = new Polynomial(-2 * c12.x * c12.y * c23.x * c23.y + c12x2 * c23y2 + c12y2 * c23x2, -2 * c12.x * c12.y * c22.x * c23.y - 2 * c12.x * c12.y * c22.y * c23.x + 2 * c12y2 * c22.x * c23.x + 2 * c12x2 * c22.y * c23.y, -2 * c12.x * c21.x * c12.y * c23.y - 2 * c12.x * c12.y * c21.y * c23.x - 2 * c12.x * c12.y * c22.x * c22.y + 2 * c21.x * c12y2 * c23.x + c12y2 * c22x2 + c12x2 * (2 * c21.y * c23.y + c22y2), 2 * c10.x * c12.x * c12.y * c23.y + 2 * c10.y * c12.x * c12.y * c23.x + c11.x * c11.y * c12.x * c23.y + c11.x * c11.y * c12.y * c23.x - 2 * c20.x * c12.x * c12.y * c23.y - 2 * c12.x * c20.y * c12.y * c23.x - 2 * c12.x * c21.x * c12.y * c22.y - 2 * c12.x * c12.y * c21.y * c22.x - 2 * c10.x * c12y2 * c23.x - 2 * c10.y * c12x2 * c23.y + 2 * c20.x * c12y2 * c23.x + 2 * c21.x * c12y2 * c22.x - c11y2 * c12.x * c23.x - c11x2 * c12.y * c23.y + c12x2 * (2 * c20.y * c23.y + 2 * c21.y * c22.y), 2 * c10.x * c12.x * c12.y * c22.y + 2 * c10.y * c12.x * c12.y * c22.x + c11.x * c11.y * c12.x * c22.y + c11.x * c11.y * c12.y * c22.x - 2 * c20.x * c12.x * c12.y * c22.y - 2 * c12.x * c20.y * c12.y * c22.x - 2 * c12.x * c21.x * c12.y * c21.y - 2 * c10.x * c12y2 * c22.x - 2 * c10.y * c12x2 * c22.y + 2 * c20.x * c12y2 * c22.x - c11y2 * c12.x * c22.x - c11x2 * c12.y * c22.y + c21x2 * c12y2 + c12x2 * (2 * c20.y * c22.y + c21y2), 2 * c10.x * c12.x * c12.y * c21.y + 2 * c10.y * c12.x * c21.x * c12.y + c11.x * c11.y * c12.x * c21.y + c11.x * c11.y * c21.x * c12.y - 2 * c20.x * c12.x * c12.y * c21.y - 2 * c12.x * c20.y * c21.x * c12.y - 2 * c10.x * c21.x * c12y2 - 2 * c10.y * c12x2 * c21.y + 2 * c20.x * c21.x * c12y2 - c11y2 * c12.x * c21.x - c11x2 * c12.y * c21.y + 2 * c12x2 * c20.y * c21.y, -2 * c10.x * c10.y * c12.x * c12.y - c10.x * c11.x * c11.y * c12.y - c10.y * c11.x * c11.y * c12.x + 2 * c10.x * c12.x * c20.y * c12.y + 2 * c10.y * c20.x * c12.x * c12.y + c11.x * c20.x * c11.y * c12.y + c11.x * c11.y * c12.x * c20.y - 2 * c20.x * c12.x * c20.y * c12.y - 2 * c10.x * c20.x * c12y2 + c10.x * c11y2 * c12.x + c10.y * c11x2 * c12.y - 2 * c10.y * c12x2 * c20.y - c20.x * c11y2 * c12.x - c11x2 * c20.y * c12.y + c10x2 * c12y2 + c10y2 * c12x2 + c20x2 * c12y2 + c12x2 * c20y2); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = roots[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var s = _step4.value; + var xRoots = new Polynomial(c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x).getRoots(); + var yRoots = new Polynomial(c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y).getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + checkRoots: for (var _iterator5 = xRoots[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var xRoot = _step5.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Circle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} c + * @param {number} r + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Circle = function (p1, p2, p3, c, r) { + return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r); + }; + /** + * intersectBezier2Ellipse + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Ellipse = function (p1, p2, p3, ec, rx, ry) { + var a; // temporary variables + // c2, c1, c0; // coefficients of quadratic + + var result = new Intersection("No Intersection"); + a = p2.multiply(-2); + var c2 = p1.add(a.add(p3)); + a = p1.multiply(-2); + var b = p2.multiply(2); + var c1 = a.add(b); + var c0 = new Point2D(p1.x, p1.y); + var rxrx = rx * rx; + var ryry = ry * ry; + var roots = new Polynomial(ryry * c2.x * c2.x + rxrx * c2.y * c2.y, 2 * (ryry * c2.x * c1.x + rxrx * c2.y * c1.y), ryry * (2 * c2.x * c0.x + c1.x * c1.x) + rxrx * (2 * c2.y * c0.y + c1.y * c1.y) - 2 * (ryry * ec.x * c2.x + rxrx * ec.y * c2.y), 2 * (ryry * c1.x * (c0.x - ec.x) + rxrx * c1.y * (c0.y - ec.y)), ryry * (c0.x * c0.x + ec.x * ec.x) + rxrx * (c0.y * c0.y + ec.y * ec.y) - 2 * (ryry * ec.x * c0.x + rxrx * ec.y * c0.y) - rxrx * ryry).getRoots(); + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = roots[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var t = _step6.value; + + if (0 <= t && t <= 1) { + result.points.push(c2.multiply(t * t).add(c1.multiply(t).add(c0))); + } + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) { + _iterator6["return"](); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Line + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Line = function (p1, p2, p3, a1, a2) { + var a; // temporary variables + // let c2, c1, c0; // coefficients of quadratic + // cl; // c coefficient for normal form of line + // n; // normal for normal form of line + + var min = a1.min(a2); // used to determine if point is on line segment + + var max = a1.max(a2); // used to determine if point is on line segment + + var result = new Intersection("No Intersection"); + a = p2.multiply(-2); + var c2 = p1.add(a.add(p3)); + a = p1.multiply(-2); + var b = p2.multiply(2); + var c1 = a.add(b); + var c0 = new Point2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 + // Find normal to line: negative inverse of original line's slope + + var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient + + var cl = a1.x * a2.y - a2.x * a1.y; // Transform cubic coefficients to line's coordinate system and find roots + // of cubic + + var roots = new Polynomial(n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but + // might not be on the line segment. + // Find intersections and calculate point coordinates + + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = roots[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var t = _step7.value; + + if (0 <= t && t <= 1) { + // We're within the Bezier curve + // Find point on Bezier + var p4 = p1.lerp(p2, t); + var p5 = p2.lerp(p3, t); + var p6 = p4.lerp(p5, t); // See if point is on line segment + // Had to make special cases for vertical and horizontal lines due + // to slight errors in calculation of p6 + + if (a1.x == a2.x) { + if (min.y <= p6.y && p6.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } else if (a1.y == a2.y) { + if (min.x <= p6.x && p6.x <= max.x) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p6); + } + } + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + + return result; + }; + /** + * intersectBezier2Polygon + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Polygon = function (p1, p2, p3, points) { + return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points)); + }; + /** + * intersectBezier2Polyline + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Polyline = function (p1, p2, p3, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + var inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier2Rectangle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier2Rectangle = function (p1, p2, p3, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight); + var inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max); + var inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft); + var inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Bezier3 + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} a3 + * @param {Point2D} a4 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @param {Point2D} b3 + * @param {Point2D} b4 + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Bezier3 = function (a1, a2, a3, a4, b1, b2, b3, b4) { + var a, b, c, d; // temporary variables + // c13, c12, c11, c10; // coefficients of cubic + // c23, c22, c21, c20; // coefficients of cubic + + var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial + + a = a1.multiply(-1); + b = a2.multiply(3); + c = a3.multiply(-3); + d = a.add(b.add(c.add(a4))); + var c13 = new Vector2D(d.x, d.y); + a = a1.multiply(3); + b = a2.multiply(-6); + c = a3.multiply(3); + d = a.add(b.add(c)); + var c12 = new Vector2D(d.x, d.y); + a = a1.multiply(-3); + b = a2.multiply(3); + c = a.add(b); + var c11 = new Vector2D(c.x, c.y); + var c10 = new Vector2D(a1.x, a1.y); + a = b1.multiply(-1); + b = b2.multiply(3); + c = b3.multiply(-3); + d = a.add(b.add(c.add(b4))); + var c23 = new Vector2D(d.x, d.y); + a = b1.multiply(3); + b = b2.multiply(-6); + c = b3.multiply(3); + d = a.add(b.add(c)); + var c22 = new Vector2D(d.x, d.y); + a = b1.multiply(-3); + b = b2.multiply(3); + c = a.add(b); + var c21 = new Vector2D(c.x, c.y); + var c20 = new Vector2D(b1.x, b1.y); // bezout + + a = c13.x * c12.y - c12.x * c13.y; + b = c13.x * c11.y - c11.x * c13.y; + var c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var c1 = c21.x * c13.y - c13.x * c21.y; + var c2 = c22.x * c13.y - c13.x * c22.y; + var c3 = c23.x * c13.y - c13.x * c23.y; + d = c13.x * c11.y - c11.x * c13.y; + var e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var e1 = c21.x * c13.y - c13.x * c21.y; + var e2 = c22.x * c13.y - c13.x * c22.y; + var e3 = c23.x * c13.y - c13.x * c23.y; + var f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; + var f1 = c21.x * c12.y - c12.x * c21.y; + var f2 = c22.x * c12.y - c12.x * c22.y; + var f3 = c23.x * c12.y - c12.x * c23.y; + var g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y; + var g1 = c21.x * c13.y - c13.x * c21.y; + var g2 = c22.x * c13.y - c13.x * c22.y; + var g3 = c23.x * c13.y - c13.x * c23.y; + var h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y; + var h1 = c21.x * c12.y - c12.x * c21.y; + var h2 = c22.x * c12.y - c12.x * c22.y; + var h3 = c23.x * c12.y - c12.x * c23.y; + var i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y; + var i1 = c21.x * c11.y - c11.x * c21.y; + var i2 = c22.x * c11.y - c11.x * c22.y; + var i3 = c23.x * c11.y - c11.x * c23.y; // determinant + + var poly = new Polynomial(-c3 * e3 * g3, -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3, -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3, -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3, -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3, -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3, -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3, -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2, -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1, -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0); + poly.simplify(); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; + + try { + for (var _iterator8 = roots[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var s = _step8.value; + var xp = new Polynomial(c13.x, c12.x, c11.x, c10.x - c20.x - s * c21.x - s * s * c22.x - s * s * s * c23.x); + xp.simplify(); + var xRoots = xp.getRoots(); + var yp = new Polynomial(c13.y, c12.y, c11.y, c10.y - c20.y - s * c21.y - s * s * c22.y - s * s * s * c23.y); + yp.simplify(); + var yRoots = yp.getRoots(); + + if (xRoots.length > 0 && yRoots.length > 0) { + var TOLERANCE = 1e-4; + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; + + try { + checkRoots: for (var _iterator9 = xRoots[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { + var xRoot = _step9.value; + + if (0 <= xRoot && xRoot <= 1) { + for (var k = 0; k < yRoots.length; k++) { + if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) { + result.points.push(c23.multiply(s * s * s).add(c22.multiply(s * s).add(c21.multiply(s).add(c20)))); + break checkRoots; + } + } + } + } + } catch (err) { + _didIteratorError9 = true; + _iteratorError9 = err; + } finally { + try { + if (!_iteratorNormalCompletion9 && _iterator9["return"] != null) { + _iterator9["return"](); + } + } finally { + if (_didIteratorError9) { + throw _iteratorError9; + } + } + } + } + } + } catch (err) { + _didIteratorError8 = true; + _iteratorError8 = err; + } finally { + try { + if (!_iteratorNormalCompletion8 && _iterator8["return"] != null) { + _iterator8["return"](); + } + } finally { + if (_didIteratorError8) { + throw _iteratorError8; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Circle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} c + * @param {number} r + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Circle = function (p1, p2, p3, p4, c, r) { + return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r); + }; + /** + * intersectBezier3Ellipse + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Ellipse = function (p1, p2, p3, p4, ec, rx, ry) { + var a, b, c, d; // temporary variables + // c3, c2, c1, c0; // coefficients of cubic + + var result = new Intersection("No Intersection"); // Calculate the coefficients of cubic polynomial + + a = p1.multiply(-1); + b = p2.multiply(3); + c = p3.multiply(-3); + d = a.add(b.add(c.add(p4))); + var c3 = new Vector2D(d.x, d.y); + a = p1.multiply(3); + b = p2.multiply(-6); + c = p3.multiply(3); + d = a.add(b.add(c)); + var c2 = new Vector2D(d.x, d.y); + a = p1.multiply(-3); + b = p2.multiply(3); + c = a.add(b); + var c1 = new Vector2D(c.x, c.y); + var c0 = new Vector2D(p1.x, p1.y); + var rxrx = rx * rx; + var ryry = ry * ry; + var poly = new Polynomial(c3.x * c3.x * ryry + c3.y * c3.y * rxrx, 2 * (c3.x * c2.x * ryry + c3.y * c2.y * rxrx), 2 * (c3.x * c1.x * ryry + c3.y * c1.y * rxrx) + c2.x * c2.x * ryry + c2.y * c2.y * rxrx, 2 * c3.x * ryry * (c0.x - ec.x) + 2 * c3.y * rxrx * (c0.y - ec.y) + 2 * (c2.x * c1.x * ryry + c2.y * c1.y * rxrx), 2 * c2.x * ryry * (c0.x - ec.x) + 2 * c2.y * rxrx * (c0.y - ec.y) + c1.x * c1.x * ryry + c1.y * c1.y * rxrx, 2 * c1.x * ryry * (c0.x - ec.x) + 2 * c1.y * rxrx * (c0.y - ec.y), c0.x * c0.x * ryry - 2 * c0.y * ec.y * rxrx - 2 * c0.x * ec.x * ryry + c0.y * c0.y * rxrx + ec.x * ec.x * ryry + ec.y * ec.y * rxrx - rxrx * ryry); + var roots = poly.getRootsInInterval(0, 1); + var _iteratorNormalCompletion10 = true; + var _didIteratorError10 = false; + var _iteratorError10 = undefined; + + try { + for (var _iterator10 = roots[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { + var t = _step10.value; + result.points.push(c3.multiply(t * t * t).add(c2.multiply(t * t).add(c1.multiply(t).add(c0)))); + } + } catch (err) { + _didIteratorError10 = true; + _iteratorError10 = err; + } finally { + try { + if (!_iteratorNormalCompletion10 && _iterator10["return"] != null) { + _iterator10["return"](); + } + } finally { + if (_didIteratorError10) { + throw _iteratorError10; + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Line + * + * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough + * sketch of the algorithm used here. Without his help, I'm not sure when I + * would have figured out this intersection problem. + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Line = function (p1, p2, p3, p4, a1, a2) { + var a, b, c, d; // temporary variables + // c3, c2, c1, c0; // coefficients of cubic + // cl; // c coefficient for normal form of line + // n; // normal for normal form of line + + var min = a1.min(a2); // used to determine if point is on line segment + + var max = a1.max(a2); // used to determine if point is on line segment + + var result = new Intersection("No Intersection"); // Start with Bezier using Bernstein polynomials for weighting functions: + // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4 + // + // Expand and collect terms to form linear combinations of original Bezier + // controls. This ends up with a vector cubic in t: + // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1 + // /\ /\ /\ /\ + // || || || || + // c3 c2 c1 c0 + // Calculate the coefficients + + a = p1.multiply(-1); + b = p2.multiply(3); + c = p3.multiply(-3); + d = a.add(b.add(c.add(p4))); + var c3 = new Vector2D(d.x, d.y); + a = p1.multiply(3); + b = p2.multiply(-6); + c = p3.multiply(3); + d = a.add(b.add(c)); + var c2 = new Vector2D(d.x, d.y); + a = p1.multiply(-3); + b = p2.multiply(3); + c = a.add(b); + var c1 = new Vector2D(c.x, c.y); + var c0 = new Vector2D(p1.x, p1.y); // Convert line to normal form: ax + by + c = 0 + // Find normal to line: negative inverse of original line's slope + + var n = new Vector2D(a1.y - a2.y, a2.x - a1.x); // Determine new c coefficient + + var cl = a1.x * a2.y - a2.x * a1.y; // ?Rotate each cubic coefficient using line for new coordinate system? + // Find roots of rotated cubic + + var roots = new Polynomial(n.dot(c3), n.dot(c2), n.dot(c1), n.dot(c0) + cl).getRoots(); // Any roots in closed interval [0,1] are intersections on Bezier, but + // might not be on the line segment. + // Find intersections and calculate point coordinates + + var _iteratorNormalCompletion11 = true; + var _didIteratorError11 = false; + var _iteratorError11 = undefined; + + try { + for (var _iterator11 = roots[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { + var t = _step11.value; + + if (0 <= t && t <= 1) { + // We're within the Bezier curve + // Find point on Bezier + var p5 = p1.lerp(p2, t); + var p6 = p2.lerp(p3, t); + var p7 = p3.lerp(p4, t); + var p8 = p5.lerp(p6, t); + var p9 = p6.lerp(p7, t); + var p10 = p8.lerp(p9, t); // See if point is on line segment + // Had to make special cases for vertical and horizontal lines due + // to slight errors in calculation of p10 + + if (a1.x == a2.x) { + if (min.y <= p10.y && p10.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } else if (a1.y == a2.y) { + if (min.x <= p10.x && p10.x <= max.x) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) { + result.status = "Intersection"; + result.appendPoint(p10); + } + } + } + } catch (err) { + _didIteratorError11 = true; + _iteratorError11 = err; + } finally { + try { + if (!_iteratorNormalCompletion11 && _iterator11["return"] != null) { + _iterator11["return"](); + } + } finally { + if (_didIteratorError11) { + throw _iteratorError11; + } + } + } + + return result; + }; + /** + * intersectBezier3Polygon + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Polygon = function (p1, p2, p3, p4, points) { + return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points)); + }; + /** + * intersectBezier3Polyline + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Polyline = function (p1, p2, p3, p4, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + var inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectBezier3Rectangle + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectBezier3Rectangle = function (p1, p2, p3, p4, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight); + var inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max); + var inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft); + var inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectCircleCircle + * + * @param {Point2D} c1 + * @param {number} r1 + * @param {Point2D} c2 + * @param {number} r2 + * @returns {Intersection} + */ + + + Intersection.intersectCircleCircle = function (c1, r1, c2, r2) { + var result; // Determine minimum and maximum radii where circles can intersect + + var r_max = r1 + r2; + var r_min = Math.abs(r1 - r2); // Determine actual distance between circle circles + + var c_dist = c1.distanceFrom(c2); + + if (c_dist > r_max) { + result = new Intersection("Outside"); + } else if (c_dist < r_min) { + result = new Intersection("Inside"); + } else { + result = new Intersection("Intersection"); + var a = (r1 * r1 - r2 * r2 + c_dist * c_dist) / (2 * c_dist); + var h = Math.sqrt(r1 * r1 - a * a); + var p = c1.lerp(c2, a / c_dist); + var b = h / c_dist; + result.points.push(new Point2D(p.x - b * (c2.y - c1.y), p.y + b * (c2.x - c1.x))); + result.points.push(new Point2D(p.x + b * (c2.y - c1.y), p.y - b * (c2.x - c1.x))); + } + + return result; + }; + /** + * intersectCircleEllipse + * + * @param {Point2D} cc + * @param {number} r + * @param {Point2D} ec + * @param {number} rx + * @param {number} ry + * @returns {Intersection} + */ + + + Intersection.intersectCircleEllipse = function (cc, r, ec, rx, ry) { + return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry); + }; + /** + * intersectCircleLine + * + * @param {Point2D} c + * @param {number} r + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectCircleLine = function (c, r, a1, a2) { + var result; + var a = (a2.x - a1.x) * (a2.x - a1.x) + (a2.y - a1.y) * (a2.y - a1.y); + var b = 2 * ((a2.x - a1.x) * (a1.x - c.x) + (a2.y - a1.y) * (a1.y - c.y)); + var cc = c.x * c.x + c.y * c.y + a1.x * a1.x + a1.y * a1.y - 2 * (c.x * a1.x + c.y * a1.y) - r * r; + var deter = b * b - 4 * a * cc; + + if (deter < 0) { + result = new Intersection("Outside"); + } else if (deter == 0) { + result = new Intersection("Tangent"); // NOTE: should calculate this point + } else { + var e = Math.sqrt(deter); + var u1 = (-b + e) / (2 * a); + var u2 = (-b - e) / (2 * a); + + if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) { + if (u1 < 0 && u2 < 0 || u1 > 1 && u2 > 1) { + result = new Intersection("Outside"); + } else { + result = new Intersection("Inside"); + } + } else { + result = new Intersection("Intersection"); + + if (0 <= u1 && u1 <= 1) { + result.points.push(a1.lerp(a2, u1)); + } + + if (0 <= u2 && u2 <= 1) { + result.points.push(a1.lerp(a2, u2)); + } + } + } + + return result; + }; + /** + * intersectCirclePolygon + * + * @param {Point2D} c + * @param {number} r + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectCirclePolygon = function (c, r, points) { + return this.intersectCirclePolyline(c, r, closePolygon(points)); + }; + /** + * intersectCirclePolyline + * + * @param {Point2D} c + * @param {number} r + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectCirclePolyline = function (c, r, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + var inter; + + for (var i = 0; i < len - 1; i++) { + var a1 = points[i]; + var a2 = points[i + 1]; + inter = Intersection.intersectCircleLine(c, r, a1, a2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } else { + result.status = inter.status; + } + + return result; + }; + /** + * intersectCircleRectangle + * + * @param {Point2D} c + * @param {number} r + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectCircleRectangle = function (c, r, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectCircleLine(c, r, min, topRight); + var inter2 = Intersection.intersectCircleLine(c, r, topRight, max); + var inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft); + var inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } else { + result.status = inter1.status; + } + + return result; + }; + /** + * intersectEllipseEllipse + * + * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.magic-software.com + * + * NOTE: Rotation will need to be added to this function + * + * @param {Point2D} c1 + * @param {number} rx1 + * @param {number} ry1 + * @param {Point2D} c2 + * @param {number} rx2 + * @param {number} ry2 + * @returns {Intersection} + */ + + + Intersection.intersectEllipseEllipse = function (c1, rx1, ry1, c2, rx2, ry2) { + var a = [ry1 * ry1, 0, rx1 * rx1, -2 * ry1 * ry1 * c1.x, -2 * rx1 * rx1 * c1.y, ry1 * ry1 * c1.x * c1.x + rx1 * rx1 * c1.y * c1.y - rx1 * rx1 * ry1 * ry1]; + var b = [ry2 * ry2, 0, rx2 * rx2, -2 * ry2 * ry2 * c2.x, -2 * rx2 * rx2 * c2.y, ry2 * ry2 * c2.x * c2.x + rx2 * rx2 * c2.y * c2.y - rx2 * rx2 * ry2 * ry2]; + var yPoly = Intersection.bezout(a, b); + var yRoots = yPoly.getRoots(); + var epsilon = 1e-3; + var norm0 = (a[0] * a[0] + 2 * a[1] * a[1] + a[2] * a[2]) * epsilon; + var norm1 = (b[0] * b[0] + 2 * b[1] * b[1] + b[2] * b[2]) * epsilon; + var result = new Intersection("No Intersection"); + + for (var y = 0; y < yRoots.length; y++) { + var xPoly = new Polynomial(a[0], a[3] + yRoots[y] * a[1], a[5] + yRoots[y] * (a[4] + yRoots[y] * a[2])); + var xRoots = xPoly.getRoots(); + + for (var x = 0; x < xRoots.length; x++) { + var tst = (a[0] * xRoots[x] + a[1] * yRoots[y] + a[3]) * xRoots[x] + (a[2] * yRoots[y] + a[4]) * yRoots[y] + a[5]; + + if (Math.abs(tst) < norm0) { + tst = (b[0] * xRoots[x] + b[1] * yRoots[y] + b[3]) * xRoots[x] + (b[2] * yRoots[y] + b[4]) * yRoots[y] + b[5]; + + if (Math.abs(tst) < norm1) { + result.appendPoint(new Point2D(xRoots[x], yRoots[y])); + } + } + } + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectEllipseLine + * + * NOTE: Rotation will need to be added to this function + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Point2D} a1 + * @param {Point2D} a2 + * @returns {Intersection} + */ + + + Intersection.intersectEllipseLine = function (c, rx, ry, a1, a2) { + var result; + var orign = new Vector2D(a1.x, a1.y); + var dir = Vector2D.fromPoints(a1, a2); + var center = new Vector2D(c.x, c.y); + var diff = orign.subtract(center); + var mDir = new Vector2D(dir.x / (rx * rx), dir.y / (ry * ry)); + var mDiff = new Vector2D(diff.x / (rx * rx), diff.y / (ry * ry)); + var a = dir.dot(mDir); + var b = dir.dot(mDiff); + c = diff.dot(mDiff) - 1.0; + var d = b * b - a * c; + + if (d < 0) { + result = new Intersection("Outside"); + } else if (d > 0) { + var root = Math.sqrt(d); // eslint-disable-line no-shadow + + var t_a = (-b - root) / a; + var t_b = (-b + root) / a; + + if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) { + if (t_a < 0 && t_b < 0 || t_a > 1 && t_b > 1) { + result = new Intersection("Outside"); + } else { + result = new Intersection("Inside"); + } + } else { + result = new Intersection("Intersection"); + + if (0 <= t_a && t_a <= 1) { + result.appendPoint(a1.lerp(a2, t_a)); + } + + if (0 <= t_b && t_b <= 1) { + result.appendPoint(a1.lerp(a2, t_b)); + } + } + } else { + var t = -b / a; + + if (0 <= t && t <= 1) { + result = new Intersection("Intersection"); + result.appendPoint(a1.lerp(a2, t)); + } else { + result = new Intersection("Outside"); + } + } + + return result; + }; + /** + * intersectEllipsePolygon + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectEllipsePolygon = function (c, rx, ry, points) { + return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points)); + }; + /** + * intersectEllipsePolyline + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectEllipsePolyline = function (c, rx, ry, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var b1 = points[i]; + var b2 = points[i + 1]; + var inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectEllipseRectangle + * + * @param {Point2D} c + * @param {number} rx + * @param {number} ry + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectEllipseRectangle = function (c, rx, ry, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight); + var inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max); + var inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft); + var inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectLineLine + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + + Intersection.intersectLineLine = function (a1, a2, b1, b2) { + var result; + var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + + if (u_b != 0) { + var ua = ua_t / u_b; + var ub = ub_t / u_b; + + if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { + result = new Intersection("Intersection"); + result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); + } else { + result = new Intersection("No Intersection"); + } + } else if (ua_t == 0 || ub_t == 0) { + result = new Intersection("Coincident"); + } else { + result = new Intersection("Parallel"); + } + + return result; + }; + /** + * intersectLinePolygon + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectLinePolygon = function (a1, a2, points) { + return this.intersectLinePolyline(a1, a2, closePolygon(points)); + }; + /** + * intersectLinePolyline + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Array} points + * @returns {Intersection} + */ + + + Intersection.intersectLinePolyline = function (a1, a2, points) { + var result = new Intersection("No Intersection"); + var len = points.length; + + for (var i = 0; i < len - 1; i++) { + var b1 = points[i]; + var b2 = points[i + 1]; + var inter = Intersection.intersectLineLine(a1, a2, b1, b2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectLineRectangle + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectLineRectangle = function (a1, a2, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLineLine(min, topRight, a1, a2); + var inter2 = Intersection.intersectLineLine(topRight, max, a1, a2); + var inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2); + var inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectPolygonPolygon + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + + Intersection.intersectPolygonPolygon = function (points1, points2) { + return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2)); + }; + /** + * intersectPolygonPolyline + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + + Intersection.intersectPolygonPolyline = function (points1, points2) { + return this.intersectPolylinePolyline(closePolygon(points1), points2); + }; + /** + * intersectPolygonRectangle + * + * @param {Array} points + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectPolygonRectangle = function (points, r1, r2) { + return this.intersectPolylineRectangle(closePolygon(points), r1, r2); + }; + /** + * intersectPolylinePolyline + * + * @param {Array} points1 + * @param {Array} points2 + * @returns {Intersection} + */ + + + Intersection.intersectPolylinePolyline = function (points1, points2) { + var result = new Intersection("No Intersection"); + var len = points1.length; + + for (var i = 0; i < len - 1; i++) { + var a1 = points1[i]; + var a2 = points1[i + 1]; + var inter = Intersection.intersectLinePolyline(a1, a2, points2); + result.appendPoints(inter.points); + } + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectPolylineRectangle + * + * @param {Array} points + * @param {Point2D} r1 + * @param {Point2D} r2 + * @returns {Intersection} + */ + + + Intersection.intersectPolylineRectangle = function (points, r1, r2) { + var min = r1.min(r2); + var max = r1.max(r2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLinePolyline(min, topRight, points); + var inter2 = Intersection.intersectLinePolyline(topRight, max, points); + var inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points); + var inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectRectangleRectangle + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + + Intersection.intersectRectangleRectangle = function (a1, a2, b1, b2) { + var min = a1.min(a2); + var max = a1.max(a2); + var topRight = new Point2D(max.x, min.y); + var bottomLeft = new Point2D(min.x, max.y); + var inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2); + var inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2); + var inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2); + var inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2); + var result = new Intersection("No Intersection"); + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = "Intersection"; + } + + return result; + }; + /** + * intersectRayRay + * + * @param {Point2D} a1 + * @param {Point2D} a2 + * @param {Point2D} b1 + * @param {Point2D} b2 + * @returns {Intersection} + */ + + + Intersection.intersectRayRay = function (a1, a2, b1, b2) { + var result; + var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + + if (u_b != 0) { + var ua = ua_t / u_b; + result = new Intersection("Intersection"); + result.points.push(new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); + } else if (ua_t == 0 || ub_t == 0) { + result = new Intersection("Coincident"); + } else { + result = new Intersection("Parallel"); + } + + return result; + }; + /** + * bezout + * + * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His + * code along with many other excellent examples are avaiable at his site: + * http://www.magic-software.com + * + * @param {Array} e1 + * @param {Array} e2 + * @returns {Polynomial} + */ + + + Intersection.bezout = function (e1, e2) { + var AB = e1[0] * e2[1] - e2[0] * e1[1]; + var AC = e1[0] * e2[2] - e2[0] * e1[2]; + var AD = e1[0] * e2[3] - e2[0] * e1[3]; + var AE = e1[0] * e2[4] - e2[0] * e1[4]; + var AF = e1[0] * e2[5] - e2[0] * e1[5]; + var BC = e1[1] * e2[2] - e2[1] * e1[2]; + var BE = e1[1] * e2[4] - e2[1] * e1[4]; + var BF = e1[1] * e2[5] - e2[1] * e1[5]; + var CD = e1[2] * e2[3] - e2[2] * e1[3]; + var DE = e1[3] * e2[4] - e2[3] * e1[4]; + var DF = e1[3] * e2[5] - e2[3] * e1[5]; + var BFpDE = BF + DE; + var BEmCD = BE - CD; + return new Polynomial(AB * BC - AC * AC, AB * BEmCD + AD * BC - 2 * AC * AE, AB * BFpDE + AD * BEmCD - AE * AE - 2 * AC * AF, AB * DF + AD * BFpDE - 2 * AE * AF, AD * DF - AF * AF); + }; + + /** + * + * IntersectionArgs.js + * + * @copyright 2002, 2017 Kevin Lindsey + * + */ + + /** + * IntersectionArgs + * + */ + var IntersectionArgs = + /*#__PURE__*/ + function () { + /** + * @param {string} name + * @param {Array} args + * @returns {IntersectionArgs} + */ + function IntersectionArgs(name, args) { + _classCallCheck(this, IntersectionArgs); + + this.init(name, args); + } + /** + * init + * + * @param {string} name + * @param {Array} args + */ + + + _createClass(IntersectionArgs, [{ + key: "init", + value: function init(name, args) { + this.name = name; + this.args = args; + } + }]); + + return IntersectionArgs; + }(); + + /** + * Shapes + * + * @copyright 2017, Kevin Lindsey + */ + var Shapes = {}; + /** + * quadraticBezier + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @param {number} p3x + * @param {number} p3y + * @returns {IntersectionArgs} + */ + + Shapes.quadraticBezier = function (p1x, p1y, p2x, p2y, p3x, p3y) { + return new IntersectionArgs("Bezier2", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y)]); + }; + /** + * cubicBezier + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @param {number} p3x + * @param {number} p3y + * @param {number} p4x + * @param {number} p4y + * @returns {IntersectionArgs} + */ + + + Shapes.cubicBezier = function (p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { + return new IntersectionArgs("Bezier3", [new Point2D(p1x, p1y), new Point2D(p2x, p2y), new Point2D(p3x, p3y), new Point2D(p4x, p4y)]); + }; + /** + * circle + * + * @param {number} centerX + * @param {number} centerY + * @param {number} radius + * @returns {IntersectionArgs} + */ + + + Shapes.circle = function (centerX, centerY, radius) { + return new IntersectionArgs("Circle", [new Point2D(centerX, centerY), radius]); + }; + /** + * ellipse + * + * @param {number} centerX + * @param {number} centerY + * @param {number} radiusX + * @param {number} radiusY + * @returns {IntersectionArgs} + */ + + + Shapes.ellipse = function (centerX, centerY, radiusX, radiusY) { + return new IntersectionArgs("Ellipse", [new Point2D(centerX, centerY), radiusX, radiusY]); + }; + /** + * line + * + * @param {number} p1x + * @param {number} p1y + * @param {number} p2x + * @param {number} p2y + * @returns {IntersectionArgs} + */ + + + Shapes.line = function (p1x, p1y, p2x, p2y) { + return new IntersectionArgs("Line", [new Point2D(p1x, p1y), new Point2D(p2x, p2y)]); + }; + /** + * path + * + * @param {Array} segments + * @returns {IntersectionArgs} + */ + + + Shapes.path = function (segments) { + return new IntersectionArgs("Path", segments); + }; + /** + * polygon + * + * @param {Array} coords + * @returns {IntersectionArgs} + */ + + + Shapes.polygon = function (coords) { + var points = []; + + for (var i = 0; i < coords.length; i += 2) { + points.push(new Point2D(coords[i], coords[i + 1])); + } + + return new IntersectionArgs("Polygon", [points]); + }; + /** + * polyline + * + * @param {Array} coords + * @returns {IntersectionArgs} + */ + + + Shapes.polyline = function (coords) { + var points = []; + + for (var i = 0; i < coords.length; i += 2) { + points.push(new Point2D(coords[i], coords[i + 1])); + } + + return new IntersectionArgs("Polyline", [points]); + }; + /** + * rectangle + * + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + * @returns {IntersectionArgs} + */ + + + Shapes.rectangle = function (x, y, width, height) { + return new IntersectionArgs("Rectangle", [new Point2D(x, y), new Point2D(x + width, y + height)]); + }; + + /** + * AffineShapes + * + * @copyright 2017, Kevin Lindsey + */ + var AffineShapes = {}; + /** + * quadraticBezier + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @returns {IntersectionArgs} + */ + + AffineShapes.quadraticBezier = function (p1, p2, p3) { + return new IntersectionArgs("Bezier2", [p1, p2, p3]); + }; + /** + * cubicBezier + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @param {Point2D} p3 + * @param {Point2D} p4 + * @returns {IntersectionArgs} + */ + + + AffineShapes.cubicBezier = function (p1, p2, p3, p4) { + return new IntersectionArgs("Bezier3", [p1, p2, p3, p4]); + }; + /** + * circle + * + * @param {Point2D} center + * @param {number} radius + * @returns {IntersectionArgs} + */ + + + AffineShapes.circle = function (center, radius) { + return new IntersectionArgs("Circle", [center, radius]); + }; + /** + * ellipse + * + * @param {Point2D} center + * @param {number} radiusX + * @param {number} radiusY + * @returns {IntersectionArgs} + */ + + + AffineShapes.ellipse = function (center, radiusX, radiusY) { + return new IntersectionArgs("Ellipse", [center, radiusX, radiusY]); + }; + /** + * line + * + * @param {Point2D} p1 + * @param {Point2D} p2 + * @returns {IntersectionArgs} + */ + + + AffineShapes.line = function (p1, p2) { + return new IntersectionArgs("Line", [p1, p2]); + }; + /** + * path + * + * @param {Array} segments + * @returns {IntersectionArgs} + */ + + + AffineShapes.path = function (segments) { + return new IntersectionArgs("Path", [segments]); + }; + /** + * polygon + * + * @param {Array} points + * @returns {IntersectionArgs} + */ + + + AffineShapes.polygon = function (points) { + return new IntersectionArgs("Polygon", [points]); + }; + /** + * polyline + * + * @param {Array} points + * @returns {IntersectionArgs} + */ + + + AffineShapes.polyline = function (points) { + return new IntersectionArgs("Polyline", [points]); + }; + /** + * rectangle + * + * @param {Point2D} topLeft + * @param {Vector2D} size + * @returns {IntersectionArgs} + */ + + + AffineShapes.rectangle = function (topLeft, size) { + return new IntersectionArgs("Rectangle", [topLeft, topLeft.add(size)]); + }; + + /** + * + * IntersectionQuery.js + * + * @copyright 2017 Kevin Lindsey + * + */ + /** + * + */ + + var IntersectionQuery = {}; + /** + * pointInCircle + * + * @param {Point2D} point + * @param {Point2D} center + * @param {number} radius + * @returns {boolean} + */ + + IntersectionQuery.pointInCircle = function (point, center, radius) { + var v = Vector2D.fromPoints(center, point); + return v.length() <= radius; + }; + /** + * pointInEllipse + * + * @param {Point2D} point + * @param {Point2D} center + * @param {number} radiusX + * @param {number} radiusY + * @returns {boolean} + */ + + + IntersectionQuery.pointInEllipse = function (point, center, radiusX, radiusY) { + var len = point.subtract(center); + return len.x * len.x / (radiusX * radiusX) + len.y * len.y / (radiusY * radiusY) <= 1; + }; + /** + * pointInPolyline + * + * @param {Point2D} point + * @param {Array} points + */ + + + IntersectionQuery.pointInPolyline = function (point, points) { + var len = points.length; + var counter = 0; + var xInter; + var p1 = points[0]; + + for (var i = 1; i <= len; i++) { + var p2 = points[i % len]; + var minY = Math.min(p1.y, p2.y); + var maxY = Math.max(p1.y, p2.y); + var maxX = Math.max(p1.x, p2.x); + + if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) { + xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x; + + if (p1.x === p2.x || point.x <= xInter) { + counter++; + } + } + + p1 = p2; + } + + return counter % 2 === 1; + }; + /** + * pointInPolyline + * + * @param {Point2D} point + * @param {Array} points + */ + + + IntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline; + /** + * pointInRectangle + * + * @param {Point2D} point + * @param {Point2D} topLeft + * @param {Point2D} bottomRight + * @returns {boolean} + */ + + IntersectionQuery.pointInRectangle = function (point, topLeft, bottomRight) { + return topLeft.x <= point.x && point.x < bottomRight.x && topLeft.y <= point.y && point.y < bottomRight.y; + }; + + // expose module classes + + exports.AffineShapes = AffineShapes; + exports.Intersection = Intersection; + exports.IntersectionArgs = IntersectionArgs; + exports.IntersectionQuery = IntersectionQuery; + exports.Matrix2D = Matrix2D; + exports.Point2D = Point2D; + exports.Shapes = Shapes; + exports.Vector2D = Vector2D; + + Object.defineProperty(exports, '__esModule', { value: true }); })); diff --git a/dist/index-umd.min.js b/dist/index-umd.min.js index 6010e02..f7c57f5 100644 --- a/dist/index-umd.min.js +++ b/dist/index-umd.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).KldIntersections={})}(this,function(t){"use strict";function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n=e(function(t){function e(t,e){Object.defineProperties(this,{x:{value:void 0!==t?t:0,writable:!1,enumerable:!0,configurable:!1},y:{value:void 0!==e?e:0,writable:!1,enumerable:!0,configurable:!1}})}e.prototype.clone=function(){return new this.constructor(this.x,this.y)},e.prototype.add=function(t){return new this.constructor(this.x+t.x,this.y+t.y)},e.prototype.subtract=function(t){return new this.constructor(this.x-t.x,this.y-t.y)},e.prototype.multiply=function(t){return new this.constructor(this.x*t,this.y*t)},e.prototype.divide=function(t){return new this.constructor(this.x/t,this.y/t)},e.prototype.equals=function(t){return this.x===t.x&&this.y===t.y},e.prototype.precisionEquals=function(t,e){return Math.abs(this.x-t.x)=0;e--)this.coefs.push(t[e]);this._variable="t",this._s=0},e.prototype.eval=function(t){if(isNaN(t))throw new Error("Polynomial.eval: parameter must be a number");for(var e=0,n=this.coefs.length-1;n>=0;n--)e=e*t+this.coefs[n];return e},e.prototype.add=function(t){for(var n=new e,i=this.getDegree(),r=t.getDegree(),s=Math.max(i,r),o=0;o<=s;o++){var a=o<=i?this.coefs[o]:0,y=o<=r?t.coefs[o]:0;n.coefs[o]=a+y}return n},e.prototype.multiply=function(t){for(var n=new e,i=0;i<=this.getDegree()+t.getDegree();i++)n.coefs.push(0);for(i=0;i<=this.getDegree();i++)for(var r=0;r<=t.getDegree();r++)n.coefs[i+r]+=this.coefs[i]*t.coefs[r];return n},e.prototype.divide_scalar=function(t){for(var e=0;e=0&&Math.abs(this.coefs[e])<=t;e--)this.coefs.pop()},e.prototype.bisection=function(t,n){var i,r=this.eval(t),s=this.eval(n);if(Math.abs(r)<=e.TOLERANCE)i=t;else if(Math.abs(s)<=e.TOLERANCE)i=n;else if(r*s<=0)for(var o=Math.log(n-t),a=Math.LN10*e.ACCURACY,y=Math.ceil((o+a)/Math.LN2),u=0;u=0;n--){var i=Math.round(1e3*this.coefs[n])/1e3;if(0!=i){var r=i<0?" - ":" + ";i=Math.abs(i),n>0&&(1==i?i=this._variable:i+=this._variable),n>1&&(i+="^"+n),e.push(r),t.push(i)}}e[0]=" + "==e[0]?"":"-";var s="";for(n=0;n=3&&(s=e.interpolate(r,i,3,o-3,0),Math.abs(s.dy)<=1e-6*s.y)));o++)i[o]=i[o-1],r[o]=.25*r[o-1];return s.y},e.prototype.getDegree=function(){return this.coefs.length-1},e.prototype.getDerivative=function(){for(var t=new e,n=1;n0){for(null!=(n=this.bisection(t,s[0]))&&r.push(n),i=0;i<=s.length-2;i++)null!=(n=this.bisection(s[i],s[i+1]))&&r.push(n);null!=(n=this.bisection(s[s.length-1],e))&&r.push(n)}else null!=(n=this.bisection(t,e))&&r.push(n)}return r},e.prototype.getLinearRoot=function(){var t=[],e=this.coefs[1];return 0!=e&&t.push(-this.coefs[0]/e),t},e.prototype.getQuadraticRoots=function(){var t=[];if(2==this.getDegree()){var e=this.coefs[2],n=this.coefs[1]/e,i=n*n-4*(this.coefs[0]/e);if(i>0){var r=Math.sqrt(i);t.push(.5*(-n+r)),t.push(.5*(-n-r))}else 0==i&&t.push(.5*-n)}return t},e.prototype.getCubicRoots=function(){var t=[];if(3==this.getDegree()){var e=this.coefs[3],n=this.coefs[2]/e,i=this.coefs[1]/e,r=(3*i-n*n)/3,s=(2*n*n*n-9*i*n+27*(this.coefs[0]/e))/27,o=n/3,a=s*s/4+r*r*r/27,y=s/2,u=this.zeroErrorEstimate();if(Math.abs(a)<=u&&(a=0),a>0){var c,h=Math.sqrt(a);c=(v=-y+h)>=0?Math.pow(v,1/3):-Math.pow(-v,1/3),(v=-y-h)>=0?c+=Math.pow(v,1/3):c-=Math.pow(-v,1/3),t.push(c-o)}else if(a<0){var l=Math.sqrt(-r/3),p=Math.atan2(Math.sqrt(-a),-y)/3,x=Math.cos(p),f=Math.sin(p),d=Math.sqrt(3);t.push(2*l*x-o),t.push(-l*(x+d*f)-o),t.push(-l*(x-d*f)-o)}else{var v;v=y>=0?-Math.pow(y,1/3):Math.pow(-y,1/3),t.push(2*v-o),t.push(-v-o)}}return t};var n=function(t){return"number"==typeof t?t?t<0?-1:1:t==t?t:NaN:NaN};e.prototype.getQuarticRoots=function(){var t=[],i=this.getDegree();if(4==i){var r=new e;r.coefs=this.coefs.slice(),r.divide_scalar(r.coefs[i]);Math.abs(r.coefs[0])<10*1e-15*Math.abs(r.coefs[3])&&(r.coefs[0]=0);var s,o=r.getDerivative(),a=o.getRoots().sort(function(t,e){return t-e}),y=[],u=a.length-1,c=this.bounds();maxabsX=Math.max(Math.abs(c.minX),Math.abs(c.maxX));var h=this.zeroErrorEstimate(maxabsX);for(s=0;s<=u;s++)y.push(r.eval(a[s]));for(s=0;s<=u;s++)Math.abs(y[s])-1){for(0!=y[0]?n(y[0])!=n(r.eval(a[0]-l)-y[0])&&(p.push(a[0]-l),x.push([c.minX,a[0]])):(t.push(a[0],a[0]),s++);s0)for(s=0;se?s:e},0)},e.prototype.bounds_UpperReal_Fujiwara=function(){var t=this.coefs,e=t.length-1,n=t[e];1!=n&&(t=this.coefs.map(function(t){return t/n}));var i,r=t.map(function(t,n){return n0)},{negX:-2*r.reduce(s,{max:0,nearmax:0}).max,posX:2*o.max}},e.prototype.bounds_LowerReal_Fujiwara=function(){var t=new e;t.coefs=this.coefs.slice().reverse();var n=t.bounds_UpperReal_Fujiwara();return n.negX=1/n.negX,n.posX=1/n.posX,n},e.prototype.bounds=function(){var t=this.bounds_UpperReal_Fujiwara(),e={minX:t.negX,maxX:t.posX};return 0===t.negX&&0===t.posX?e:(0===t.negX?e.minX=this.bounds_LowerReal_Fujiwara().posX:0===t.posX&&(e.maxX=this.bounds_LowerReal_Fujiwara().negX),e.minX>e.maxX&&(e.minX=e.maxX=0),e)},e.newton_secant_bisection=function(t,e,i,r,s,o){var a,u,c,h,l,p,x=0,f=0;a=t;var d=Math.pow(10,-14),v="number"==typeof s&&"number"==typeof o;if(v){if(s>o)throw new Error("newton root finding: min must be greater than max");if(l=e(s),p=e(o),n(l)==n(p))throw new Error("newton root finding: y values of bounds must be of opposite sign")}var w,m=function(){return Math.abs(c)<=d*Math.abs(a)||f==a-c-a};for(w=0;wo){if(n(l)==n(p))break;var g=p-l,b=o-s;if(c=0==g?a-(s+.5*b):Math.abs(g/Math.min(l,p))>50?a-(s+b*(.5+(Math.abs(l)0&&(n.status="Intersection"),n},x.intersectBezier2Bezier2=function(t,e,n,i,r,s){var a,y,u=new x("No Intersection");a=e.multiply(-2);var c=t.add(a.add(n));a=t.multiply(-2),y=e.multiply(2);var l=a.add(y),p=new o(t.x,t.y);a=r.multiply(-2);var f=i.add(a.add(s));a=i.multiply(-2),y=r.multiply(2);var d=a.add(y),v=new o(i.x,i.y);a=c.x*l.y-l.x*c.y,y=f.x*l.y-l.x*f.y;var w=d.x*l.y-l.x*d.y,m=l.x*(p.y-v.y)+l.y*(-p.x+v.x),g=f.x*c.y-c.x*f.y,b=d.x*c.y-c.x*d.y,P=c.x*(p.y-v.y)+c.y*(-p.x+v.x),M=new h(-g*g,-2*g*b,a*y-b*b-2*g*P,a*w-2*b*P,a*m-P*P).getRoots(),I=!0,N=!1,L=void 0;try{for(var R,E=M[Symbol.iterator]();!(I=(R=E.next()).done);I=!0){var z=R.value;if(0<=z&&z<=1){var B=new h(c.x,l.x,p.x-v.x-z*d.x-z*z*f.x);B.simplify();var X=B.getRoots(),C=new h(c.y,l.y,p.y-v.y-z*d.y-z*z*f.y);C.simplify();var _=C.getRoots();if(X.length>0&&_.length>0){var S=!0,q=!1,A=void 0;try{t:for(var D,k=X[Symbol.iterator]();!(S=(D=k.next()).done);S=!0){var O=D.value;if(0<=O&&O<=1)for(var j=0;j<_.length;j++)if(Math.abs(O-_[j])<1e-4){u.points.push(f.multiply(z*z).add(d.multiply(z).add(v)));break t}}}catch(t){q=!0,A=t}finally{try{S||null==k.return||k.return()}finally{if(q)throw A}}}}}}catch(t){N=!0,L=t}finally{try{I||null==E.return||E.return()}finally{if(N)throw L}}return u.points.length>0&&(u.status="Intersection"),u},x.intersectBezier2Bezier3=function(t,e,n,i,r,s,y){var u,c,l,p,f=new x("No Intersection");u=e.multiply(-2);var d=t.add(u.add(n));u=t.multiply(-2),c=e.multiply(2);var v=u.add(c),w=new o(t.x,t.y);u=i.multiply(-1),c=r.multiply(3),l=s.multiply(-3),p=u.add(c.add(l.add(y)));var m=new a(p.x,p.y);u=i.multiply(3),c=r.multiply(-6),l=s.multiply(3),p=u.add(c.add(l));var g=new a(p.x,p.y);u=i.multiply(-3),c=r.multiply(3),l=u.add(c);var b=new a(l.x,l.y),P=new a(i.x,i.y),M=w.x*w.x,I=w.y*w.y,N=v.x*v.x,L=v.y*v.y,R=d.x*d.x,E=d.y*d.y,z=P.x*P.x,B=P.y*P.y,X=b.x*b.x,C=b.y*b.y,_=g.x*g.x,S=g.y*g.y,q=m.x*m.x,A=m.y*m.y,D=new h(-2*d.x*d.y*m.x*m.y+R*A+E*q,-2*d.x*d.y*g.x*m.y-2*d.x*d.y*g.y*m.x+2*E*g.x*m.x+2*R*g.y*m.y,-2*d.x*b.x*d.y*m.y-2*d.x*d.y*b.y*m.x-2*d.x*d.y*g.x*g.y+2*b.x*E*m.x+E*_+R*(2*b.y*m.y+S),2*w.x*d.x*d.y*m.y+2*w.y*d.x*d.y*m.x+v.x*v.y*d.x*m.y+v.x*v.y*d.y*m.x-2*P.x*d.x*d.y*m.y-2*d.x*P.y*d.y*m.x-2*d.x*b.x*d.y*g.y-2*d.x*d.y*b.y*g.x-2*w.x*E*m.x-2*w.y*R*m.y+2*P.x*E*m.x+2*b.x*E*g.x-L*d.x*m.x-N*d.y*m.y+R*(2*P.y*m.y+2*b.y*g.y),2*w.x*d.x*d.y*g.y+2*w.y*d.x*d.y*g.x+v.x*v.y*d.x*g.y+v.x*v.y*d.y*g.x-2*P.x*d.x*d.y*g.y-2*d.x*P.y*d.y*g.x-2*d.x*b.x*d.y*b.y-2*w.x*E*g.x-2*w.y*R*g.y+2*P.x*E*g.x-L*d.x*g.x-N*d.y*g.y+X*E+R*(2*P.y*g.y+C),2*w.x*d.x*d.y*b.y+2*w.y*d.x*b.x*d.y+v.x*v.y*d.x*b.y+v.x*v.y*b.x*d.y-2*P.x*d.x*d.y*b.y-2*d.x*P.y*b.x*d.y-2*w.x*b.x*E-2*w.y*R*b.y+2*P.x*b.x*E-L*d.x*b.x-N*d.y*b.y+2*R*P.y*b.y,-2*w.x*w.y*d.x*d.y-w.x*v.x*v.y*d.y-w.y*v.x*v.y*d.x+2*w.x*d.x*P.y*d.y+2*w.y*P.x*d.x*d.y+v.x*P.x*v.y*d.y+v.x*v.y*d.x*P.y-2*P.x*d.x*P.y*d.y-2*w.x*P.x*E+w.x*L*d.x+w.y*N*d.y-2*w.y*R*P.y-P.x*L*d.x-N*P.y*d.y+M*E+I*R+z*E+R*B).getRootsInInterval(0,1),k=!0,O=!1,j=void 0;try{for(var T,F=D[Symbol.iterator]();!(k=(T=F.next()).done);k=!0){var U=T.value,Y=new h(d.x,v.x,w.x-P.x-U*b.x-U*U*g.x-U*U*U*m.x).getRoots(),Q=new h(d.y,v.y,w.y-P.y-U*b.y-U*U*g.y-U*U*U*m.y).getRoots();if(Y.length>0&&Q.length>0){var V=!0,K=!1,G=void 0;try{t:for(var H,J=Y[Symbol.iterator]();!(V=(H=J.next()).done);V=!0){var W=H.value;if(0<=W&&W<=1)for(var Z=0;Z0&&(f.status="Intersection"),f},x.intersectBezier2Circle=function(t,e,n,i,r){return x.intersectBezier2Ellipse(t,e,n,i,r,r)},x.intersectBezier2Ellipse=function(t,e,n,i,r,s){var a,y=new x("No Intersection");a=e.multiply(-2);var u=t.add(a.add(n));a=t.multiply(-2);var c=e.multiply(2),l=a.add(c),p=new o(t.x,t.y),f=r*r,d=s*s,v=new h(d*u.x*u.x+f*u.y*u.y,2*(d*u.x*l.x+f*u.y*l.y),d*(2*u.x*p.x+l.x*l.x)+f*(2*u.y*p.y+l.y*l.y)-2*(d*i.x*u.x+f*i.y*u.y),2*(d*l.x*(p.x-i.x)+f*l.y*(p.y-i.y)),d*(p.x*p.x+i.x*i.x)+f*(p.y*p.y+i.y*i.y)-2*(d*i.x*p.x+f*i.y*p.y)-f*d).getRoots(),w=!0,m=!1,g=void 0;try{for(var b,P=v[Symbol.iterator]();!(w=(b=P.next()).done);w=!0){var M=b.value;0<=M&&M<=1&&y.points.push(u.multiply(M*M).add(l.multiply(M).add(p)))}}catch(t){m=!0,g=t}finally{try{w||null==P.return||P.return()}finally{if(m)throw g}}return y.points.length>0&&(y.status="Intersection"),y},x.intersectBezier2Line=function(t,e,n,i,r){var s,y=i.min(r),u=i.max(r),c=new x("No Intersection");s=e.multiply(-2);var l=t.add(s.add(n));s=t.multiply(-2);var p=e.multiply(2),f=s.add(p),d=new o(t.x,t.y),v=new a(i.y-r.y,r.x-i.x),w=i.x*r.y-r.x*i.y,m=new h(v.dot(l),v.dot(f),v.dot(d)+w).getRoots(),g=!0,b=!1,P=void 0;try{for(var M,I=m[Symbol.iterator]();!(g=(M=I.next()).done);g=!0){var N=M.value;if(0<=N&&N<=1){var L=t.lerp(e,N),R=e.lerp(n,N),E=L.lerp(R,N);i.x==r.x?y.y<=E.y&&E.y<=u.y&&(c.status="Intersection",c.appendPoint(E)):i.y==r.y?y.x<=E.x&&E.x<=u.x&&(c.status="Intersection",c.appendPoint(E)):y.x<=E.x&&E.x<=u.x&&y.y<=E.y&&E.y<=u.y&&(c.status="Intersection",c.appendPoint(E))}}}catch(t){b=!0,P=t}finally{try{g||null==I.return||I.return()}finally{if(b)throw P}}return c},x.intersectBezier2Polygon=function(t,e,n,i){return x.intersectBezier2Polyline(t,e,n,p(i))},x.intersectBezier2Polyline=function(t,e,n,i){for(var r=new x("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},x.intersectBezier2Rectangle=function(t,e,n,i,r){var s=i.min(r),a=i.max(r),y=new o(a.x,s.y),u=new o(s.x,a.y),c=x.intersectBezier2Line(t,e,n,s,y),h=x.intersectBezier2Line(t,e,n,y,a),l=x.intersectBezier2Line(t,e,n,a,u),p=x.intersectBezier2Line(t,e,n,u,s),f=new x("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(p.points),f.points.length>0&&(f.status="Intersection"),f},x.intersectBezier3Bezier3=function(t,e,n,i,r,s,o,y){var u,c,l,p,f=new x("No Intersection");u=t.multiply(-1),c=e.multiply(3),l=n.multiply(-3),p=u.add(c.add(l.add(i)));var d=new a(p.x,p.y);u=t.multiply(3),c=e.multiply(-6),l=n.multiply(3),p=u.add(c.add(l));var v=new a(p.x,p.y);u=t.multiply(-3),c=e.multiply(3),l=u.add(c);var w=new a(l.x,l.y),m=new a(t.x,t.y);u=r.multiply(-1),c=s.multiply(3),l=o.multiply(-3),p=u.add(c.add(l.add(y)));var g=new a(p.x,p.y);u=r.multiply(3),c=s.multiply(-6),l=o.multiply(3),p=u.add(c.add(l));var b=new a(p.x,p.y);u=r.multiply(-3),c=s.multiply(3),l=u.add(c);var P=new a(l.x,l.y),M=new a(r.x,r.y);u=d.x*v.y-v.x*d.y,c=d.x*w.y-w.x*d.y;var I=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,N=P.x*d.y-d.x*P.y,L=b.x*d.y-d.x*b.y,R=g.x*d.y-d.x*g.y;p=d.x*w.y-w.x*d.y;var E=d.x*m.y+v.x*w.y-w.x*v.y-m.x*d.y+M.x*d.y-d.x*M.y,z=P.x*d.y-d.x*P.y,B=b.x*d.y-d.x*b.y,X=g.x*d.y-d.x*g.y,C=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,_=P.x*v.y-v.x*P.y,S=b.x*v.y-v.x*b.y,q=g.x*v.y-v.x*g.y,A=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,D=P.x*d.y-d.x*P.y,k=b.x*d.y-d.x*b.y,O=g.x*d.y-d.x*g.y,j=v.x*m.y-m.x*v.y+M.x*v.y-v.x*M.y,T=P.x*v.y-v.x*P.y,F=b.x*v.y-v.x*b.y,U=g.x*v.y-v.x*g.y,Y=w.x*m.y-m.x*w.y+M.x*w.y-w.x*M.y,Q=P.x*w.y-w.x*P.y,V=b.x*w.y-w.x*b.y,K=g.x*w.y-w.x*g.y,G=new h(-R*X*O,-R*X*k-R*B*O-L*X*O,-R*X*D-R*B*k-L*X*k-R*z*O-L*B*O-N*X*O,-R*X*A-R*B*D-L*X*D-R*z*k-L*B*k-N*X*k-R*E*O-L*z*O-N*B*O-I*X*O+c*q*O+R*p*U-u*q*U+u*X*K,-R*B*A-L*X*A-R*z*D-L*B*D-N*X*D-R*E*k-L*z*k-N*B*k-I*X*k+c*q*k-L*E*O-N*z*O-I*B*O+c*S*O+R*p*F-u*q*F+L*p*U-u*S*U+u*X*V+u*B*K,-R*z*A-L*B*A-N*X*A-R*E*D-L*z*D-N*B*D-I*X*D+c*q*D-L*E*k-N*z*k-I*B*k+c*S*k-N*E*O-I*z*O+c*_*O+R*p*T-u*q*T+L*p*F-u*S*F+N*p*U-u*_*U+u*X*Q+u*B*V+u*z*K,-R*E*A-L*z*A-N*B*A-I*X*A+c*q*A-L*E*D-N*z*D-I*B*D+c*S*D-N*E*k-I*z*k+c*_*k-I*E*O+c*C*O+R*p*j-u*q*j+L*p*T-u*S*T+N*p*F-u*_*F+I*p*U-u*C*U+u*X*Y+u*B*Q+u*z*V-c*p*K+u*E*K,-L*E*A-N*z*A-I*B*A+c*S*A-N*E*D-I*z*D+c*_*D-I*E*k+c*C*k+L*p*j-u*S*j+N*p*T-u*_*T+I*p*F-u*C*F+u*B*Y+u*z*Q-c*p*V+u*E*V,-N*E*A-I*z*A+c*_*A-I*E*D+c*C*D+N*p*j-u*_*j+I*p*T-u*C*T+u*z*Y-c*p*Q+u*E*Q,-I*E*A+c*C*A+I*p*j-u*C*j-c*p*Y+u*E*Y);G.simplify();var H=G.getRootsInInterval(0,1),J=!0,W=!1,Z=void 0;try{for(var $,tt=H[Symbol.iterator]();!(J=($=tt.next()).done);J=!0){var et=$.value,nt=new h(d.x,v.x,w.x,m.x-M.x-et*P.x-et*et*b.x-et*et*et*g.x);nt.simplify();var it=nt.getRoots(),rt=new h(d.y,v.y,w.y,m.y-M.y-et*P.y-et*et*b.y-et*et*et*g.y);rt.simplify();var st=rt.getRoots();if(it.length>0&&st.length>0){var ot=!0,at=!1,yt=void 0;try{t:for(var ut,ct=it[Symbol.iterator]();!(ot=(ut=ct.next()).done);ot=!0){var ht=ut.value;if(0<=ht&&ht<=1)for(var lt=0;lt0&&(f.status="Intersection"),f},x.intersectBezier3Circle=function(t,e,n,i,r,s){return x.intersectBezier3Ellipse(t,e,n,i,r,s,s)},x.intersectBezier3Ellipse=function(t,e,n,i,r,s,o){var y,u,c,l,p=new x("No Intersection");y=t.multiply(-1),u=e.multiply(3),c=n.multiply(-3),l=y.add(u.add(c.add(i)));var f=new a(l.x,l.y);y=t.multiply(3),u=e.multiply(-6),c=n.multiply(3),l=y.add(u.add(c));var d=new a(l.x,l.y);y=t.multiply(-3),u=e.multiply(3),c=y.add(u);var v=new a(c.x,c.y),w=new a(t.x,t.y),m=s*s,g=o*o,b=new h(f.x*f.x*g+f.y*f.y*m,2*(f.x*d.x*g+f.y*d.y*m),2*(f.x*v.x*g+f.y*v.y*m)+d.x*d.x*g+d.y*d.y*m,2*f.x*g*(w.x-r.x)+2*f.y*m*(w.y-r.y)+2*(d.x*v.x*g+d.y*v.y*m),2*d.x*g*(w.x-r.x)+2*d.y*m*(w.y-r.y)+v.x*v.x*g+v.y*v.y*m,2*v.x*g*(w.x-r.x)+2*v.y*m*(w.y-r.y),w.x*w.x*g-2*w.y*r.y*m-2*w.x*r.x*g+w.y*w.y*m+r.x*r.x*g+r.y*r.y*m-m*g).getRootsInInterval(0,1),P=!0,M=!1,I=void 0;try{for(var N,L=b[Symbol.iterator]();!(P=(N=L.next()).done);P=!0){var R=N.value;p.points.push(f.multiply(R*R*R).add(d.multiply(R*R).add(v.multiply(R).add(w))))}}catch(t){M=!0,I=t}finally{try{P||null==L.return||L.return()}finally{if(M)throw I}}return p.points.length>0&&(p.status="Intersection"),p},x.intersectBezier3Line=function(t,e,n,i,r,s){var o,y,u,c,l=r.min(s),p=r.max(s),f=new x("No Intersection");o=t.multiply(-1),y=e.multiply(3),u=n.multiply(-3),c=o.add(y.add(u.add(i)));var d=new a(c.x,c.y);o=t.multiply(3),y=e.multiply(-6),u=n.multiply(3),c=o.add(y.add(u));var v=new a(c.x,c.y);o=t.multiply(-3),y=e.multiply(3),u=o.add(y);var w=new a(u.x,u.y),m=new a(t.x,t.y),g=new a(r.y-s.y,s.x-r.x),b=r.x*s.y-s.x*r.y,P=new h(g.dot(d),g.dot(v),g.dot(w),g.dot(m)+b).getRoots(),M=!0,I=!1,N=void 0;try{for(var L,R=P[Symbol.iterator]();!(M=(L=R.next()).done);M=!0){var E=L.value;if(0<=E&&E<=1){var z=t.lerp(e,E),B=e.lerp(n,E),X=n.lerp(i,E),C=z.lerp(B,E),_=B.lerp(X,E),S=C.lerp(_,E);r.x==s.x?l.y<=S.y&&S.y<=p.y&&(f.status="Intersection",f.appendPoint(S)):r.y==s.y?l.x<=S.x&&S.x<=p.x&&(f.status="Intersection",f.appendPoint(S)):l.x<=S.x&&S.x<=p.x&&l.y<=S.y&&S.y<=p.y&&(f.status="Intersection",f.appendPoint(S))}}}catch(t){I=!0,N=t}finally{try{M||null==R.return||R.return()}finally{if(I)throw N}}return f},x.intersectBezier3Polygon=function(t,e,n,i,r){return this.intersectBezier3Polyline(t,e,n,i,p(r))},x.intersectBezier3Polyline=function(t,e,n,i,r){for(var s=new x("No Intersection"),o=r.length,a=0;a0&&(s.status="Intersection"),s},x.intersectBezier3Rectangle=function(t,e,n,i,r,s){var a=r.min(s),y=r.max(s),u=new o(y.x,a.y),c=new o(a.x,y.y),h=x.intersectBezier3Line(t,e,n,i,a,u),l=x.intersectBezier3Line(t,e,n,i,u,y),p=x.intersectBezier3Line(t,e,n,i,y,c),f=x.intersectBezier3Line(t,e,n,i,c,a),d=new x("No Intersection");return d.appendPoints(h.points),d.appendPoints(l.points),d.appendPoints(p.points),d.appendPoints(f.points),d.points.length>0&&(d.status="Intersection"),d},x.intersectCircleCircle=function(t,e,n,i){var r,s=e+i,a=Math.abs(e-i),y=t.distanceFrom(n);if(y>s)r=new x("Outside");else if(y1)&&(c<0||c>1)?r=new x(u<0&&c<0||u>1&&c>1?"Outside":"Inside"):(r=new x("Intersection"),0<=u&&u<=1&&r.points.push(n.lerp(i,u)),0<=c&&c<=1&&r.points.push(n.lerp(i,c)))}return r},x.intersectCirclePolygon=function(t,e,n){return this.intersectCirclePolyline(t,e,p(n))},x.intersectCirclePolyline=function(t,e,n){for(var i,r=new x("No Intersection"),s=n.length,o=0;o0?r.status="Intersection":r.status=i.status,r},x.intersectCircleRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),a=new o(s.x,r.y),y=new o(r.x,s.y),u=x.intersectCircleLine(t,e,r,a),c=x.intersectCircleLine(t,e,a,s),h=x.intersectCircleLine(t,e,s,y),l=x.intersectCircleLine(t,e,y,r),p=new x("No Intersection");return p.appendPoints(u.points),p.appendPoints(c.points),p.appendPoints(h.points),p.appendPoints(l.points),p.points.length>0?p.status="Intersection":p.status=u.status,p},x.intersectEllipseEllipse=function(t,e,n,i,r,s){for(var a=[n*n,0,e*e,-2*n*n*t.x,-2*e*e*t.y,n*n*t.x*t.x+e*e*t.y*t.y-e*e*n*n],y=[s*s,0,r*r,-2*s*s*i.x,-2*r*r*i.y,s*s*i.x*i.x+r*r*i.y*i.y-r*r*s*s],u=x.bezout(a,y).getRoots(),c=.001*(a[0]*a[0]+2*a[1]*a[1]+a[2]*a[2]),l=.001*(y[0]*y[0]+2*y[1]*y[1]+y[2]*y[2]),p=new x("No Intersection"),f=0;f0&&(p.status="Intersection"),p},x.intersectEllipseLine=function(t,e,n,i,r){var s,o=new a(i.x,i.y),y=a.fromPoints(i,r),u=new a(t.x,t.y),c=o.subtract(u),h=new a(y.x/(e*e),y.y/(n*n)),l=new a(c.x/(e*e),c.y/(n*n)),p=y.dot(h),f=y.dot(l),d=f*f-p*(t=c.dot(l)-1);if(d<0)s=new x("Outside");else if(d>0){var v=Math.sqrt(d),w=(-f-v)/p,m=(-f+v)/p;(w<0||11&&m>1?"Outside":"Inside"):(s=new x("Intersection"),0<=w&&w<=1&&s.appendPoint(i.lerp(r,w)),0<=m&&m<=1&&s.appendPoint(i.lerp(r,m)))}else{var g=-f/p;0<=g&&g<=1?(s=new x("Intersection")).appendPoint(i.lerp(r,g)):s=new x("Outside")}return s},x.intersectEllipsePolygon=function(t,e,n,i){return this.intersectEllipsePolyline(t,e,n,p(i))},x.intersectEllipsePolyline=function(t,e,n,i){for(var r=new x("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},x.intersectEllipseRectangle=function(t,e,n,i,r){var s=i.min(r),a=i.max(r),y=new o(a.x,s.y),u=new o(s.x,a.y),c=x.intersectEllipseLine(t,e,n,s,y),h=x.intersectEllipseLine(t,e,n,y,a),l=x.intersectEllipseLine(t,e,n,a,u),p=x.intersectEllipseLine(t,e,n,u,s),f=new x("No Intersection");return f.appendPoints(c.points),f.appendPoints(h.points),f.appendPoints(l.points),f.appendPoints(p.points),f.points.length>0&&(f.status="Intersection"),f},x.intersectLineLine=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=s/y,c=a/y;0<=u&&u<=1&&0<=c&&c<=1?(r=new x("Intersection")).points.push(new o(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y))):r=new x("No Intersection")}else r=new x(0==s||0==a?"Coincident":"Parallel");return r},x.intersectLinePolygon=function(t,e,n){return this.intersectLinePolyline(t,e,p(n))},x.intersectLinePolyline=function(t,e,n){for(var i=new x("No Intersection"),r=n.length,s=0;s0&&(i.status="Intersection"),i},x.intersectLineRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),a=new o(s.x,r.y),y=new o(r.x,s.y),u=x.intersectLineLine(r,a,t,e),c=x.intersectLineLine(a,s,t,e),h=x.intersectLineLine(s,y,t,e),l=x.intersectLineLine(y,r,t,e),p=new x("No Intersection");return p.appendPoints(u.points),p.appendPoints(c.points),p.appendPoints(h.points),p.appendPoints(l.points),p.points.length>0&&(p.status="Intersection"),p},x.intersectPolygonPolygon=function(t,e){return this.intersectPolylinePolyline(p(t),p(e))},x.intersectPolygonPolyline=function(t,e){return this.intersectPolylinePolyline(p(t),e)},x.intersectPolygonRectangle=function(t,e,n){return this.intersectPolylineRectangle(p(t),e,n)},x.intersectPolylinePolyline=function(t,e){for(var n=new x("No Intersection"),i=t.length,r=0;r0&&(n.status="Intersection"),n},x.intersectPolylineRectangle=function(t,e,n){var i=e.min(n),r=e.max(n),s=new o(r.x,i.y),a=new o(i.x,r.y),y=x.intersectLinePolyline(i,s,t),u=x.intersectLinePolyline(s,r,t),c=x.intersectLinePolyline(r,a,t),h=x.intersectLinePolyline(a,i,t),l=new x("No Intersection");return l.appendPoints(y.points),l.appendPoints(u.points),l.appendPoints(c.points),l.appendPoints(h.points),l.points.length>0&&(l.status="Intersection"),l},x.intersectRectangleRectangle=function(t,e,n,i){var r=t.min(e),s=t.max(e),a=new o(s.x,r.y),y=new o(r.x,s.y),u=x.intersectLineRectangle(r,a,n,i),c=x.intersectLineRectangle(a,s,n,i),h=x.intersectLineRectangle(s,y,n,i),l=x.intersectLineRectangle(y,r,n,i),p=new x("No Intersection");return p.appendPoints(u.points),p.appendPoints(c.points),p.appendPoints(h.points),p.appendPoints(l.points),p.points.length>0&&(p.status="Intersection"),p},x.intersectRayRay=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),a=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),y=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=y){var u=s/y;(r=new x("Intersection")).points.push(new o(t.x+u*(e.x-t.x),t.y+u*(e.y-t.y)))}else r=new x(0==s||0==a?"Coincident":"Parallel");return r},x.bezout=function(t,e){var n=t[0]*e[1]-e[0]*t[1],i=t[0]*e[2]-e[0]*t[2],r=t[0]*e[3]-e[0]*t[3],s=t[0]*e[4]-e[0]*t[4],o=t[0]*e[5]-e[0]*t[5],a=t[1]*e[2]-e[1]*t[2],y=t[1]*e[4]-e[1]*t[4],u=t[1]*e[5]-e[1]*t[5],c=t[2]*e[3]-e[2]*t[3],l=t[3]*e[4]-e[3]*t[4],p=t[3]*e[5]-e[3]*t[5],x=u+l,f=y-c;return new h(n*a-i*i,n*f+r*a-2*i*s,n*x+r*f-s*s-2*i*o,n*p+r*x-2*s*o,r*p-o*o)},f.prototype.init=function(t,e){this.name=t,this.args=e};var d={quadraticBezier:function(t,e,n,i,r,s){return new f("Bezier2",[new o(t,e),new o(n,i),new o(r,s)])},cubicBezier:function(t,e,n,i,r,s,a,y){return new f("Bezier3",[new o(t,e),new o(n,i),new o(r,s),new o(a,y)])},circle:function(t,e,n){return new f("Circle",[new o(t,e),n])},ellipse:function(t,e,n,i){return new f("Ellipse",[new o(t,e),n,i])},line:function(t,e,n,i){return new f("Line",[new o(t,e),new o(n,i)])},path:function(t){return new f("Path",t)},polygon:function(t){for(var e=[],n=0;n=0;e--)this.coefs.push(t[e]);this._variable="t",this._s=0},e.prototype.eval=function(t){if(isNaN(t))throw new Error("Polynomial.eval: parameter must be a number");for(var e=0,n=this.coefs.length-1;n>=0;n--)e=e*t+this.coefs[n];return e},e.prototype.add=function(t){for(var n=new e,i=this.getDegree(),r=t.getDegree(),s=Math.max(i,r),o=0;o<=s;o++){var a=o<=i?this.coefs[o]:0,y=o<=r?t.coefs[o]:0;n.coefs[o]=a+y}return n},e.prototype.multiply=function(t){for(var n=new e,i=0;i<=this.getDegree()+t.getDegree();i++)n.coefs.push(0);for(i=0;i<=this.getDegree();i++)for(var r=0;r<=t.getDegree();r++)n.coefs[i+r]+=this.coefs[i]*t.coefs[r];return n},e.prototype.divide_scalar=function(t){for(var e=0;e=0&&Math.abs(this.coefs[e])<=t;e--)this.coefs.pop()},e.prototype.bisection=function(t,n){var i,r=this.eval(t),s=this.eval(n);if(Math.abs(r)<=e.TOLERANCE)i=t;else if(Math.abs(s)<=e.TOLERANCE)i=n;else if(r*s<=0)for(var o=Math.log(n-t),a=Math.LN10*e.ACCURACY,y=Math.ceil((o+a)/Math.LN2),u=0;u=0;n--){var i=Math.round(1e3*this.coefs[n])/1e3;if(0!=i){var r=i<0?" - ":" + ";i=Math.abs(i),n>0&&(1==i?i=this._variable:i+=this._variable),n>1&&(i+="^"+n),e.push(r),t.push(i)}}e[0]=" + "==e[0]?"":"-";var s="";for(n=0;n=3&&(s=e.interpolate(r,i,3,o-3,0),Math.abs(s.dy)<=1e-6*s.y)));o++)i[o]=i[o-1],r[o]=.25*r[o-1];return s.y},e.prototype.getDegree=function(){return this.coefs.length-1},e.prototype.getDerivative=function(){for(var t=new e,n=1;n0){for(null!=(n=this.bisection(t,s[0]))&&r.push(n),i=0;i<=s.length-2;i++)null!=(n=this.bisection(s[i],s[i+1]))&&r.push(n);null!=(n=this.bisection(s[s.length-1],e))&&r.push(n)}else null!=(n=this.bisection(t,e))&&r.push(n)}return r},e.prototype.getLinearRoot=function(){var t=[],e=this.coefs[1];return 0!=e&&t.push(-this.coefs[0]/e),t},e.prototype.getQuadraticRoots=function(){var t=[];if(2==this.getDegree()){var e=this.coefs[2],n=this.coefs[1]/e,i=n*n-4*(this.coefs[0]/e);if(i>0){var r=Math.sqrt(i);t.push(.5*(-n+r)),t.push(.5*(-n-r))}else 0==i&&t.push(.5*-n)}return t},e.prototype.getCubicRoots=function(){var t=[];if(3==this.getDegree()){var e=this.coefs[3],n=this.coefs[2]/e,i=this.coefs[1]/e,r=(3*i-n*n)/3,s=(2*n*n*n-9*i*n+27*(this.coefs[0]/e))/27,o=n/3,a=s*s/4+r*r*r/27,y=s/2,u=this.zeroErrorEstimate();if(Math.abs(a)<=u&&(a=0),a>0){var c,l=Math.sqrt(a);c=(v=-y+l)>=0?Math.pow(v,1/3):-Math.pow(-v,1/3),(v=-y-l)>=0?c+=Math.pow(v,1/3):c-=Math.pow(-v,1/3),t.push(c-o)}else if(a<0){var h=Math.sqrt(-r/3),p=Math.atan2(Math.sqrt(-a),-y)/3,x=Math.cos(p),f=Math.sin(p),d=Math.sqrt(3);t.push(2*h*x-o),t.push(-h*(x+d*f)-o),t.push(-h*(x-d*f)-o)}else{var v;v=y>=0?-Math.pow(y,1/3):Math.pow(-y,1/3),t.push(2*v-o),t.push(-v-o)}}return t};var n=function(t){return"number"==typeof t?t?t<0?-1:1:t==t?t:NaN:NaN};e.prototype.getQuarticRoots=function(){var t=[],i=this.getDegree();if(4==i){var r=new e;r.coefs=this.coefs.slice(),r.divide_scalar(r.coefs[i]);Math.abs(r.coefs[0])<10*1e-15*Math.abs(r.coefs[3])&&(r.coefs[0]=0);var s,o=r.getDerivative(),a=o.getRoots().sort(function(t,e){return t-e}),y=[],u=a.length-1,c=this.bounds();maxabsX=Math.max(Math.abs(c.minX),Math.abs(c.maxX));var l=this.zeroErrorEstimate(maxabsX);for(s=0;s<=u;s++)y.push(r.eval(a[s]));for(s=0;s<=u;s++)Math.abs(y[s])-1){for(0!=y[0]?n(y[0])!=n(r.eval(a[0]-h)-y[0])&&(p.push(a[0]-h),x.push([c.minX,a[0]])):(t.push(a[0],a[0]),s++);s0)for(s=0;se?s:e},0)},e.prototype.bounds_UpperReal_Fujiwara=function(){var t=this.coefs,e=t.length-1,n=t[e];1!=n&&(t=this.coefs.map(function(t){return t/n}));var i,r=t.map(function(t,n){return n0)},{negX:-2*r.reduce(s,{max:0,nearmax:0}).max,posX:2*o.max}},e.prototype.bounds_LowerReal_Fujiwara=function(){var t=new e;t.coefs=this.coefs.slice().reverse();var n=t.bounds_UpperReal_Fujiwara();return n.negX=1/n.negX,n.posX=1/n.posX,n},e.prototype.bounds=function(){var t=this.bounds_UpperReal_Fujiwara(),e={minX:t.negX,maxX:t.posX};return 0===t.negX&&0===t.posX?e:(0===t.negX?e.minX=this.bounds_LowerReal_Fujiwara().posX:0===t.posX&&(e.maxX=this.bounds_LowerReal_Fujiwara().negX),e.minX>e.maxX&&(e.minX=e.maxX=0),e)},e.newton_secant_bisection=function(t,e,i,r,s,o){var a,u,c,l,h,p,x=0,f=0;a=t;var d=Math.pow(10,-14),v="number"==typeof s&&"number"==typeof o;if(v){if(s>o)throw new Error("newton root finding: min must be greater than max");if(h=e(s),p=e(o),n(h)==n(p))throw new Error("newton root finding: y values of bounds must be of opposite sign")}var w,m=function(){return Math.abs(c)<=d*Math.abs(a)||f==a-c-a};for(w=0;wo){if(n(h)==n(p))break;var g=p-h,b=o-s;if(c=0==g?a-(s+.5*b):Math.abs(g/Math.min(h,p))>50?a-(s+b*(.5+(Math.abs(h)0&&(n.status="Intersection"),n},v.intersectBezier2Bezier2=function(t,e,n,i,r,s){var o,a,y=new v("No Intersection");o=e.multiply(-2);var u=t.add(o.add(n));o=t.multiply(-2),a=e.multiply(2);var l=o.add(a),h=new c(t.x,t.y);o=r.multiply(-2);var p=i.add(o.add(s));o=i.multiply(-2),a=r.multiply(2);var f=o.add(a),d=new c(i.x,i.y);o=u.x*l.y-l.x*u.y,a=p.x*l.y-l.x*p.y;var w=f.x*l.y-l.x*f.y,m=l.x*(h.y-d.y)+l.y*(-h.x+d.x),g=p.x*u.y-u.x*p.y,b=f.x*u.y-u.x*f.y,P=u.x*(h.y-d.y)+u.y*(-h.x+d.x),M=new x(-g*g,-2*g*b,o*a-b*b-2*g*P,o*w-2*b*P,o*m-P*P).getRoots(),I=!0,N=!1,L=void 0;try{for(var R,E=M[Symbol.iterator]();!(I=(R=E.next()).done);I=!0){var z=R.value;if(0<=z&&z<=1){var B=new x(u.x,l.x,h.x-d.x-z*f.x-z*z*p.x);B.simplify();var X=B.getRoots(),C=new x(u.y,l.y,h.y-d.y-z*f.y-z*z*p.y);C.simplify();var _=C.getRoots();if(X.length>0&&_.length>0){var S=!0,q=!1,A=void 0;try{t:for(var k,D=X[Symbol.iterator]();!(S=(k=D.next()).done);S=!0){var O=k.value;if(0<=O&&O<=1)for(var j=0;j<_.length;j++)if(Math.abs(O-_[j])<1e-4){y.points.push(p.multiply(z*z).add(f.multiply(z).add(d)));break t}}}catch(t){q=!0,A=t}finally{try{S||null==D.return||D.return()}finally{if(q)throw A}}}}}}catch(t){N=!0,L=t}finally{try{I||null==E.return||E.return()}finally{if(N)throw L}}return y.points.length>0&&(y.status="Intersection"),y},v.intersectBezier2Bezier3=function(t,e,n,i,r,s,o){var a,y,u,h,p=new v("No Intersection");a=e.multiply(-2);var f=t.add(a.add(n));a=t.multiply(-2),y=e.multiply(2);var d=a.add(y),w=new c(t.x,t.y);a=i.multiply(-1),y=r.multiply(3),u=s.multiply(-3),h=a.add(y.add(u.add(o)));var m=new l(h.x,h.y);a=i.multiply(3),y=r.multiply(-6),u=s.multiply(3),h=a.add(y.add(u));var g=new l(h.x,h.y);a=i.multiply(-3),y=r.multiply(3),u=a.add(y);var b=new l(u.x,u.y),P=new l(i.x,i.y),M=w.x*w.x,I=w.y*w.y,N=d.x*d.x,L=d.y*d.y,R=f.x*f.x,E=f.y*f.y,z=P.x*P.x,B=P.y*P.y,X=b.x*b.x,C=b.y*b.y,_=g.x*g.x,S=g.y*g.y,q=m.x*m.x,A=m.y*m.y,k=new x(-2*f.x*f.y*m.x*m.y+R*A+E*q,-2*f.x*f.y*g.x*m.y-2*f.x*f.y*g.y*m.x+2*E*g.x*m.x+2*R*g.y*m.y,-2*f.x*b.x*f.y*m.y-2*f.x*f.y*b.y*m.x-2*f.x*f.y*g.x*g.y+2*b.x*E*m.x+E*_+R*(2*b.y*m.y+S),2*w.x*f.x*f.y*m.y+2*w.y*f.x*f.y*m.x+d.x*d.y*f.x*m.y+d.x*d.y*f.y*m.x-2*P.x*f.x*f.y*m.y-2*f.x*P.y*f.y*m.x-2*f.x*b.x*f.y*g.y-2*f.x*f.y*b.y*g.x-2*w.x*E*m.x-2*w.y*R*m.y+2*P.x*E*m.x+2*b.x*E*g.x-L*f.x*m.x-N*f.y*m.y+R*(2*P.y*m.y+2*b.y*g.y),2*w.x*f.x*f.y*g.y+2*w.y*f.x*f.y*g.x+d.x*d.y*f.x*g.y+d.x*d.y*f.y*g.x-2*P.x*f.x*f.y*g.y-2*f.x*P.y*f.y*g.x-2*f.x*b.x*f.y*b.y-2*w.x*E*g.x-2*w.y*R*g.y+2*P.x*E*g.x-L*f.x*g.x-N*f.y*g.y+X*E+R*(2*P.y*g.y+C),2*w.x*f.x*f.y*b.y+2*w.y*f.x*b.x*f.y+d.x*d.y*f.x*b.y+d.x*d.y*b.x*f.y-2*P.x*f.x*f.y*b.y-2*f.x*P.y*b.x*f.y-2*w.x*b.x*E-2*w.y*R*b.y+2*P.x*b.x*E-L*f.x*b.x-N*f.y*b.y+2*R*P.y*b.y,-2*w.x*w.y*f.x*f.y-w.x*d.x*d.y*f.y-w.y*d.x*d.y*f.x+2*w.x*f.x*P.y*f.y+2*w.y*P.x*f.x*f.y+d.x*P.x*d.y*f.y+d.x*d.y*f.x*P.y-2*P.x*f.x*P.y*f.y-2*w.x*P.x*E+w.x*L*f.x+w.y*N*f.y-2*w.y*R*P.y-P.x*L*f.x-N*P.y*f.y+M*E+I*R+z*E+R*B).getRootsInInterval(0,1),D=!0,O=!1,j=void 0;try{for(var T,F=k[Symbol.iterator]();!(D=(T=F.next()).done);D=!0){var U=T.value,Y=new x(f.x,d.x,w.x-P.x-U*b.x-U*U*g.x-U*U*U*m.x).getRoots(),Q=new x(f.y,d.y,w.y-P.y-U*b.y-U*U*g.y-U*U*U*m.y).getRoots();if(Y.length>0&&Q.length>0){var V=!0,K=!1,G=void 0;try{t:for(var H,J=Y[Symbol.iterator]();!(V=(H=J.next()).done);V=!0){var W=H.value;if(0<=W&&W<=1)for(var Z=0;Z0&&(p.status="Intersection"),p},v.intersectBezier2Circle=function(t,e,n,i,r){return v.intersectBezier2Ellipse(t,e,n,i,r,r)},v.intersectBezier2Ellipse=function(t,e,n,i,r,s){var o,a=new v("No Intersection");o=e.multiply(-2);var y=t.add(o.add(n));o=t.multiply(-2);var u=e.multiply(2),l=o.add(u),h=new c(t.x,t.y),p=r*r,f=s*s,d=new x(f*y.x*y.x+p*y.y*y.y,2*(f*y.x*l.x+p*y.y*l.y),f*(2*y.x*h.x+l.x*l.x)+p*(2*y.y*h.y+l.y*l.y)-2*(f*i.x*y.x+p*i.y*y.y),2*(f*l.x*(h.x-i.x)+p*l.y*(h.y-i.y)),f*(h.x*h.x+i.x*i.x)+p*(h.y*h.y+i.y*i.y)-2*(f*i.x*h.x+p*i.y*h.y)-p*f).getRoots(),w=!0,m=!1,g=void 0;try{for(var b,P=d[Symbol.iterator]();!(w=(b=P.next()).done);w=!0){var M=b.value;0<=M&&M<=1&&a.points.push(y.multiply(M*M).add(l.multiply(M).add(h)))}}catch(t){m=!0,g=t}finally{try{w||null==P.return||P.return()}finally{if(m)throw g}}return a.points.length>0&&(a.status="Intersection"),a},v.intersectBezier2Line=function(t,e,n,i,r){var s,o=i.min(r),a=i.max(r),y=new v("No Intersection");s=e.multiply(-2);var u=t.add(s.add(n));s=t.multiply(-2);var h=e.multiply(2),p=s.add(h),f=new c(t.x,t.y),d=new l(i.y-r.y,r.x-i.x),w=i.x*r.y-r.x*i.y,m=new x(d.dot(u),d.dot(p),d.dot(f)+w).getRoots(),g=!0,b=!1,P=void 0;try{for(var M,I=m[Symbol.iterator]();!(g=(M=I.next()).done);g=!0){var N=M.value;if(0<=N&&N<=1){var L=t.lerp(e,N),R=e.lerp(n,N),E=L.lerp(R,N);i.x==r.x?o.y<=E.y&&E.y<=a.y&&(y.status="Intersection",y.appendPoint(E)):i.y==r.y?o.x<=E.x&&E.x<=a.x&&(y.status="Intersection",y.appendPoint(E)):o.x<=E.x&&E.x<=a.x&&o.y<=E.y&&E.y<=a.y&&(y.status="Intersection",y.appendPoint(E))}}}catch(t){b=!0,P=t}finally{try{g||null==I.return||I.return()}finally{if(b)throw P}}return y},v.intersectBezier2Polygon=function(t,e,n,i){return v.intersectBezier2Polyline(t,e,n,d(i))},v.intersectBezier2Polyline=function(t,e,n,i){for(var r=new v("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},v.intersectBezier2Rectangle=function(t,e,n,i,r){var s=i.min(r),o=i.max(r),a=new c(o.x,s.y),y=new c(s.x,o.y),u=v.intersectBezier2Line(t,e,n,s,a),l=v.intersectBezier2Line(t,e,n,a,o),h=v.intersectBezier2Line(t,e,n,o,y),p=v.intersectBezier2Line(t,e,n,y,s),x=new v("No Intersection");return x.appendPoints(u.points),x.appendPoints(l.points),x.appendPoints(h.points),x.appendPoints(p.points),x.points.length>0&&(x.status="Intersection"),x},v.intersectBezier3Bezier3=function(t,e,n,i,r,s,o,a){var y,u,c,h,p=new v("No Intersection");y=t.multiply(-1),u=e.multiply(3),c=n.multiply(-3),h=y.add(u.add(c.add(i)));var f=new l(h.x,h.y);y=t.multiply(3),u=e.multiply(-6),c=n.multiply(3),h=y.add(u.add(c));var d=new l(h.x,h.y);y=t.multiply(-3),u=e.multiply(3),c=y.add(u);var w=new l(c.x,c.y),m=new l(t.x,t.y);y=r.multiply(-1),u=s.multiply(3),c=o.multiply(-3),h=y.add(u.add(c.add(a)));var g=new l(h.x,h.y);y=r.multiply(3),u=s.multiply(-6),c=o.multiply(3),h=y.add(u.add(c));var b=new l(h.x,h.y);y=r.multiply(-3),u=s.multiply(3),c=y.add(u);var P=new l(c.x,c.y),M=new l(r.x,r.y);y=f.x*d.y-d.x*f.y,u=f.x*w.y-w.x*f.y;var I=f.x*m.y-m.x*f.y+M.x*f.y-f.x*M.y,N=P.x*f.y-f.x*P.y,L=b.x*f.y-f.x*b.y,R=g.x*f.y-f.x*g.y;h=f.x*w.y-w.x*f.y;var E=f.x*m.y+d.x*w.y-w.x*d.y-m.x*f.y+M.x*f.y-f.x*M.y,z=P.x*f.y-f.x*P.y,B=b.x*f.y-f.x*b.y,X=g.x*f.y-f.x*g.y,C=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,_=P.x*d.y-d.x*P.y,S=b.x*d.y-d.x*b.y,q=g.x*d.y-d.x*g.y,A=f.x*m.y-m.x*f.y+M.x*f.y-f.x*M.y,k=P.x*f.y-f.x*P.y,D=b.x*f.y-f.x*b.y,O=g.x*f.y-f.x*g.y,j=d.x*m.y-m.x*d.y+M.x*d.y-d.x*M.y,T=P.x*d.y-d.x*P.y,F=b.x*d.y-d.x*b.y,U=g.x*d.y-d.x*g.y,Y=w.x*m.y-m.x*w.y+M.x*w.y-w.x*M.y,Q=P.x*w.y-w.x*P.y,V=b.x*w.y-w.x*b.y,K=g.x*w.y-w.x*g.y,G=new x(-R*X*O,-R*X*D-R*B*O-L*X*O,-R*X*k-R*B*D-L*X*D-R*z*O-L*B*O-N*X*O,-R*X*A-R*B*k-L*X*k-R*z*D-L*B*D-N*X*D-R*E*O-L*z*O-N*B*O-I*X*O+u*q*O+R*h*U-y*q*U+y*X*K,-R*B*A-L*X*A-R*z*k-L*B*k-N*X*k-R*E*D-L*z*D-N*B*D-I*X*D+u*q*D-L*E*O-N*z*O-I*B*O+u*S*O+R*h*F-y*q*F+L*h*U-y*S*U+y*X*V+y*B*K,-R*z*A-L*B*A-N*X*A-R*E*k-L*z*k-N*B*k-I*X*k+u*q*k-L*E*D-N*z*D-I*B*D+u*S*D-N*E*O-I*z*O+u*_*O+R*h*T-y*q*T+L*h*F-y*S*F+N*h*U-y*_*U+y*X*Q+y*B*V+y*z*K,-R*E*A-L*z*A-N*B*A-I*X*A+u*q*A-L*E*k-N*z*k-I*B*k+u*S*k-N*E*D-I*z*D+u*_*D-I*E*O+u*C*O+R*h*j-y*q*j+L*h*T-y*S*T+N*h*F-y*_*F+I*h*U-y*C*U+y*X*Y+y*B*Q+y*z*V-u*h*K+y*E*K,-L*E*A-N*z*A-I*B*A+u*S*A-N*E*k-I*z*k+u*_*k-I*E*D+u*C*D+L*h*j-y*S*j+N*h*T-y*_*T+I*h*F-y*C*F+y*B*Y+y*z*Q-u*h*V+y*E*V,-N*E*A-I*z*A+u*_*A-I*E*k+u*C*k+N*h*j-y*_*j+I*h*T-y*C*T+y*z*Y-u*h*Q+y*E*Q,-I*E*A+u*C*A+I*h*j-y*C*j-u*h*Y+y*E*Y);G.simplify();var H=G.getRootsInInterval(0,1),J=!0,W=!1,Z=void 0;try{for(var $,tt=H[Symbol.iterator]();!(J=($=tt.next()).done);J=!0){var et=$.value,nt=new x(f.x,d.x,w.x,m.x-M.x-et*P.x-et*et*b.x-et*et*et*g.x);nt.simplify();var it=nt.getRoots(),rt=new x(f.y,d.y,w.y,m.y-M.y-et*P.y-et*et*b.y-et*et*et*g.y);rt.simplify();var st=rt.getRoots();if(it.length>0&&st.length>0){var ot=!0,at=!1,yt=void 0;try{t:for(var ut,ct=it[Symbol.iterator]();!(ot=(ut=ct.next()).done);ot=!0){var lt=ut.value;if(0<=lt&<<=1)for(var ht=0;ht0&&(p.status="Intersection"),p},v.intersectBezier3Circle=function(t,e,n,i,r,s){return v.intersectBezier3Ellipse(t,e,n,i,r,s,s)},v.intersectBezier3Ellipse=function(t,e,n,i,r,s,o){var a,y,u,c,h=new v("No Intersection");a=t.multiply(-1),y=e.multiply(3),u=n.multiply(-3),c=a.add(y.add(u.add(i)));var p=new l(c.x,c.y);a=t.multiply(3),y=e.multiply(-6),u=n.multiply(3),c=a.add(y.add(u));var f=new l(c.x,c.y);a=t.multiply(-3),y=e.multiply(3),u=a.add(y);var d=new l(u.x,u.y),w=new l(t.x,t.y),m=s*s,g=o*o,b=new x(p.x*p.x*g+p.y*p.y*m,2*(p.x*f.x*g+p.y*f.y*m),2*(p.x*d.x*g+p.y*d.y*m)+f.x*f.x*g+f.y*f.y*m,2*p.x*g*(w.x-r.x)+2*p.y*m*(w.y-r.y)+2*(f.x*d.x*g+f.y*d.y*m),2*f.x*g*(w.x-r.x)+2*f.y*m*(w.y-r.y)+d.x*d.x*g+d.y*d.y*m,2*d.x*g*(w.x-r.x)+2*d.y*m*(w.y-r.y),w.x*w.x*g-2*w.y*r.y*m-2*w.x*r.x*g+w.y*w.y*m+r.x*r.x*g+r.y*r.y*m-m*g).getRootsInInterval(0,1),P=!0,M=!1,I=void 0;try{for(var N,L=b[Symbol.iterator]();!(P=(N=L.next()).done);P=!0){var R=N.value;h.points.push(p.multiply(R*R*R).add(f.multiply(R*R).add(d.multiply(R).add(w))))}}catch(t){M=!0,I=t}finally{try{P||null==L.return||L.return()}finally{if(M)throw I}}return h.points.length>0&&(h.status="Intersection"),h},v.intersectBezier3Line=function(t,e,n,i,r,s){var o,a,y,u,c=r.min(s),h=r.max(s),p=new v("No Intersection");o=t.multiply(-1),a=e.multiply(3),y=n.multiply(-3),u=o.add(a.add(y.add(i)));var f=new l(u.x,u.y);o=t.multiply(3),a=e.multiply(-6),y=n.multiply(3),u=o.add(a.add(y));var d=new l(u.x,u.y);o=t.multiply(-3),a=e.multiply(3),y=o.add(a);var w=new l(y.x,y.y),m=new l(t.x,t.y),g=new l(r.y-s.y,s.x-r.x),b=r.x*s.y-s.x*r.y,P=new x(g.dot(f),g.dot(d),g.dot(w),g.dot(m)+b).getRoots(),M=!0,I=!1,N=void 0;try{for(var L,R=P[Symbol.iterator]();!(M=(L=R.next()).done);M=!0){var E=L.value;if(0<=E&&E<=1){var z=t.lerp(e,E),B=e.lerp(n,E),X=n.lerp(i,E),C=z.lerp(B,E),_=B.lerp(X,E),S=C.lerp(_,E);r.x==s.x?c.y<=S.y&&S.y<=h.y&&(p.status="Intersection",p.appendPoint(S)):r.y==s.y?c.x<=S.x&&S.x<=h.x&&(p.status="Intersection",p.appendPoint(S)):c.x<=S.x&&S.x<=h.x&&c.y<=S.y&&S.y<=h.y&&(p.status="Intersection",p.appendPoint(S))}}}catch(t){I=!0,N=t}finally{try{M||null==R.return||R.return()}finally{if(I)throw N}}return p},v.intersectBezier3Polygon=function(t,e,n,i,r){return this.intersectBezier3Polyline(t,e,n,i,d(r))},v.intersectBezier3Polyline=function(t,e,n,i,r){for(var s=new v("No Intersection"),o=r.length,a=0;a0&&(s.status="Intersection"),s},v.intersectBezier3Rectangle=function(t,e,n,i,r,s){var o=r.min(s),a=r.max(s),y=new c(a.x,o.y),u=new c(o.x,a.y),l=v.intersectBezier3Line(t,e,n,i,o,y),h=v.intersectBezier3Line(t,e,n,i,y,a),p=v.intersectBezier3Line(t,e,n,i,a,u),x=v.intersectBezier3Line(t,e,n,i,u,o),f=new v("No Intersection");return f.appendPoints(l.points),f.appendPoints(h.points),f.appendPoints(p.points),f.appendPoints(x.points),f.points.length>0&&(f.status="Intersection"),f},v.intersectCircleCircle=function(t,e,n,i){var r,s=e+i,o=Math.abs(e-i),a=t.distanceFrom(n);if(a>s)r=new v("Outside");else if(a1)&&(c<0||c>1)?r=new v(u<0&&c<0||u>1&&c>1?"Outside":"Inside"):(r=new v("Intersection"),0<=u&&u<=1&&r.points.push(n.lerp(i,u)),0<=c&&c<=1&&r.points.push(n.lerp(i,c)))}return r},v.intersectCirclePolygon=function(t,e,n){return this.intersectCirclePolyline(t,e,d(n))},v.intersectCirclePolyline=function(t,e,n){for(var i,r=new v("No Intersection"),s=n.length,o=0;o0?r.status="Intersection":r.status=i.status,r},v.intersectCircleRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),o=new c(s.x,r.y),a=new c(r.x,s.y),y=v.intersectCircleLine(t,e,r,o),u=v.intersectCircleLine(t,e,o,s),l=v.intersectCircleLine(t,e,s,a),h=v.intersectCircleLine(t,e,a,r),p=new v("No Intersection");return p.appendPoints(y.points),p.appendPoints(u.points),p.appendPoints(l.points),p.appendPoints(h.points),p.points.length>0?p.status="Intersection":p.status=y.status,p},v.intersectEllipseEllipse=function(t,e,n,i,r,s){for(var o=[n*n,0,e*e,-2*n*n*t.x,-2*e*e*t.y,n*n*t.x*t.x+e*e*t.y*t.y-e*e*n*n],a=[s*s,0,r*r,-2*s*s*i.x,-2*r*r*i.y,s*s*i.x*i.x+r*r*i.y*i.y-r*r*s*s],y=v.bezout(o,a).getRoots(),u=.001*(o[0]*o[0]+2*o[1]*o[1]+o[2]*o[2]),l=.001*(a[0]*a[0]+2*a[1]*a[1]+a[2]*a[2]),h=new v("No Intersection"),p=0;p0&&(h.status="Intersection"),h},v.intersectEllipseLine=function(t,e,n,i,r){var s,o=new l(i.x,i.y),a=l.fromPoints(i,r),y=new l(t.x,t.y),u=o.subtract(y),c=new l(a.x/(e*e),a.y/(n*n)),h=new l(u.x/(e*e),u.y/(n*n)),p=a.dot(c),x=a.dot(h),f=x*x-p*(t=u.dot(h)-1);if(f<0)s=new v("Outside");else if(f>0){var d=Math.sqrt(f),w=(-x-d)/p,m=(-x+d)/p;(w<0||11&&m>1?"Outside":"Inside"):(s=new v("Intersection"),0<=w&&w<=1&&s.appendPoint(i.lerp(r,w)),0<=m&&m<=1&&s.appendPoint(i.lerp(r,m)))}else{var g=-x/p;0<=g&&g<=1?(s=new v("Intersection")).appendPoint(i.lerp(r,g)):s=new v("Outside")}return s},v.intersectEllipsePolygon=function(t,e,n,i){return this.intersectEllipsePolyline(t,e,n,d(i))},v.intersectEllipsePolyline=function(t,e,n,i){for(var r=new v("No Intersection"),s=i.length,o=0;o0&&(r.status="Intersection"),r},v.intersectEllipseRectangle=function(t,e,n,i,r){var s=i.min(r),o=i.max(r),a=new c(o.x,s.y),y=new c(s.x,o.y),u=v.intersectEllipseLine(t,e,n,s,a),l=v.intersectEllipseLine(t,e,n,a,o),h=v.intersectEllipseLine(t,e,n,o,y),p=v.intersectEllipseLine(t,e,n,y,s),x=new v("No Intersection");return x.appendPoints(u.points),x.appendPoints(l.points),x.appendPoints(h.points),x.appendPoints(p.points),x.points.length>0&&(x.status="Intersection"),x},v.intersectLineLine=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),o=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),a=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=a){var y=s/a,u=o/a;0<=y&&y<=1&&0<=u&&u<=1?(r=new v("Intersection")).points.push(new c(t.x+y*(e.x-t.x),t.y+y*(e.y-t.y))):r=new v("No Intersection")}else r=new v(0==s||0==o?"Coincident":"Parallel");return r},v.intersectLinePolygon=function(t,e,n){return this.intersectLinePolyline(t,e,d(n))},v.intersectLinePolyline=function(t,e,n){for(var i=new v("No Intersection"),r=n.length,s=0;s0&&(i.status="Intersection"),i},v.intersectLineRectangle=function(t,e,n,i){var r=n.min(i),s=n.max(i),o=new c(s.x,r.y),a=new c(r.x,s.y),y=v.intersectLineLine(r,o,t,e),u=v.intersectLineLine(o,s,t,e),l=v.intersectLineLine(s,a,t,e),h=v.intersectLineLine(a,r,t,e),p=new v("No Intersection");return p.appendPoints(y.points),p.appendPoints(u.points),p.appendPoints(l.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p},v.intersectPolygonPolygon=function(t,e){return this.intersectPolylinePolyline(d(t),d(e))},v.intersectPolygonPolyline=function(t,e){return this.intersectPolylinePolyline(d(t),e)},v.intersectPolygonRectangle=function(t,e,n){return this.intersectPolylineRectangle(d(t),e,n)},v.intersectPolylinePolyline=function(t,e){for(var n=new v("No Intersection"),i=t.length,r=0;r0&&(n.status="Intersection"),n},v.intersectPolylineRectangle=function(t,e,n){var i=e.min(n),r=e.max(n),s=new c(r.x,i.y),o=new c(i.x,r.y),a=v.intersectLinePolyline(i,s,t),y=v.intersectLinePolyline(s,r,t),u=v.intersectLinePolyline(r,o,t),l=v.intersectLinePolyline(o,i,t),h=new v("No Intersection");return h.appendPoints(a.points),h.appendPoints(y.points),h.appendPoints(u.points),h.appendPoints(l.points),h.points.length>0&&(h.status="Intersection"),h},v.intersectRectangleRectangle=function(t,e,n,i){var r=t.min(e),s=t.max(e),o=new c(s.x,r.y),a=new c(r.x,s.y),y=v.intersectLineRectangle(r,o,n,i),u=v.intersectLineRectangle(o,s,n,i),l=v.intersectLineRectangle(s,a,n,i),h=v.intersectLineRectangle(a,r,n,i),p=new v("No Intersection");return p.appendPoints(y.points),p.appendPoints(u.points),p.appendPoints(l.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p},v.intersectRayRay=function(t,e,n,i){var r,s=(i.x-n.x)*(t.y-n.y)-(i.y-n.y)*(t.x-n.x),o=(e.x-t.x)*(t.y-n.y)-(e.y-t.y)*(t.x-n.x),a=(i.y-n.y)*(e.x-t.x)-(i.x-n.x)*(e.y-t.y);if(0!=a){var y=s/a;(r=new v("Intersection")).points.push(new c(t.x+y*(e.x-t.x),t.y+y*(e.y-t.y)))}else r=new v(0==s||0==o?"Coincident":"Parallel");return r},v.bezout=function(t,e){var n=t[0]*e[1]-e[0]*t[1],i=t[0]*e[2]-e[0]*t[2],r=t[0]*e[3]-e[0]*t[3],s=t[0]*e[4]-e[0]*t[4],o=t[0]*e[5]-e[0]*t[5],a=t[1]*e[2]-e[1]*t[2],y=t[1]*e[4]-e[1]*t[4],u=t[1]*e[5]-e[1]*t[5],c=t[2]*e[3]-e[2]*t[3],l=t[3]*e[4]-e[3]*t[4],h=t[3]*e[5]-e[3]*t[5],p=u+l,f=y-c;return new x(n*a-i*i,n*f+r*a-2*i*s,n*p+r*f-s*s-2*i*o,n*h+r*p-2*s*o,r*h-o*o)};var w=function(){function t(n,i){e(this,t),this.init(n,i)}return r(t,[{key:"init",value:function(t,e){this.name=t,this.args=e}}]),t}(),m={quadraticBezier:function(t,e,n,i,r,s){return new w("Bezier2",[new c(t,e),new c(n,i),new c(r,s)])},cubicBezier:function(t,e,n,i,r,s,o,a){return new w("Bezier3",[new c(t,e),new c(n,i),new c(r,s),new c(o,a)])},circle:function(t,e,n){return new w("Circle",[new c(t,e),n])},ellipse:function(t,e,n,i){return new w("Ellipse",[new c(t,e),n,i])},line:function(t,e,n,i){return new w("Line",[new c(t,e),new c(n,i)])},path:function(t){return new w("Path",t)},polygon:function(t){for(var e=[],n=0;n\n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n * @class\n * @param {string} status\n */\nfunction Intersection(status) {\n this.init(status);\n}\n\n\n/**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\nIntersection.prototype.init = function(status) {\n this.status = status;\n this.points = [];\n};\n\n\n/**\n * appendPoint\n *\n * @param {Point2D} point\n */\nIntersection.prototype.appendPoint = function(point) {\n this.points.push(point);\n};\n\n\n/**\n * appendPoints\n *\n * @param {Array} points\n */\nIntersection.prototype.appendPoints = function(points) {\n this.points = this.points.concat(points);\n};\n\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\nfunction IntersectionArgs(name, args) {\n this.init(name, args);\n}\n\n/**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\nIntersectionArgs.prototype.init = function(name, args) {\n this.name = name;\n this.args = args;\n};\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","IntersectionArgs","name","args","appendPoint","point","appendPoints","intersect","shape1","shape2","intersectPathShape","method","apply","path","shape","segment","inter","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"8RAeA,SAASA,EAAQC,EAAGC,GAChBC,OAAOC,iBAAiBC,KAAM,GACrB,CACDC,WAAaC,IAANN,EAAkBA,EAAI,EAC7BO,UAAU,EACVC,YAAY,EACZC,cAAc,KAEb,CACDJ,WAAaC,IAANL,EAAkBA,EAAI,EAC7BM,UAAU,EACVC,YAAY,EACZC,cAAc,KAU1BV,EAAQW,UAAUC,MAAQ,kBACf,IAAIP,KAAKQ,YAAYR,KAAKJ,EAAGI,KAAKH,IAS7CF,EAAQW,UAAUG,IAAM,SAASC,UACtB,IAAIV,KAAKQ,YAAYR,KAAKJ,EAAEc,EAAKd,EAAGI,KAAKH,EAAEa,EAAKb,IAS3DF,EAAQW,UAAUK,SAAW,SAASD,UAC3B,IAAIV,KAAKQ,YAAYR,KAAKJ,EAAEc,EAAKd,EAAGI,KAAKH,EAAEa,EAAKb,IAS3DF,EAAQW,UAAUM,SAAW,SAASC,UAC3B,IAAIb,KAAKQ,YAAYR,KAAKJ,EAAEiB,EAAQb,KAAKH,EAAEgB,IAStDlB,EAAQW,UAAUQ,OAAS,SAASD,UACzB,IAAIb,KAAKQ,YAAYR,KAAKJ,EAAEiB,EAAQb,KAAKH,EAAEgB,IAStDlB,EAAQW,UAAUS,OAAS,SAASL,UACvBV,KAAKJ,IAAMc,EAAKd,GAAKI,KAAKH,IAAMa,EAAKb,GAUlDF,EAAQW,UAAUU,gBAAkB,SAASN,EAAMO,UAE3CC,KAAKC,IAAInB,KAAKJ,EAAIc,EAAKd,GAAKqB,GAC5BC,KAAKC,IAAInB,KAAKH,EAAIa,EAAKb,GAAKoB,GAapCtB,EAAQW,UAAUc,KAAO,SAASV,EAAMW,OAChCC,EAAM,EAAMD,SAET,IAAIrB,KAAKQ,YACZR,KAAKJ,EAAI0B,EAAMZ,EAAKd,EAAIyB,EACxBrB,KAAKH,EAAIyB,EAAMZ,EAAKb,EAAIwB,IAUhC1B,EAAQW,UAAUiB,aAAe,SAASb,OAClCc,EAAKxB,KAAKJ,EAAIc,EAAKd,EACnB6B,EAAKzB,KAAKH,EAAIa,EAAKb,SAEhBqB,KAAKQ,KAAKF,EAAGA,EAAKC,EAAGA,IAShC9B,EAAQW,UAAUqB,IAAM,SAASjB,UACtB,IAAIV,KAAKQ,YACZU,KAAKS,IAAK3B,KAAKJ,EAAGc,EAAKd,GACvBsB,KAAKS,IAAK3B,KAAKH,EAAGa,EAAKb,KAU/BF,EAAQW,UAAUsB,IAAM,SAASlB,UACtB,IAAIV,KAAKQ,YACZU,KAAKU,IAAK5B,KAAKJ,EAAGc,EAAKd,GACvBsB,KAAKU,IAAK5B,KAAKH,EAAGa,EAAKb,KAU/BF,EAAQW,UAAUuB,UAAY,SAASC,UAC5B,IAAI9B,KAAKQ,YACZsB,EAAOC,EAAI/B,KAAKJ,EAAIkC,EAAOE,EAAIhC,KAAKH,EAAIiC,EAAOG,EAC/CH,EAAOI,EAAIlC,KAAKJ,EAAIkC,EAAOK,EAAInC,KAAKH,EAAIiC,EAAOM,IASvDzC,EAAQW,UAAU+B,SAAW,iBAClB,SAAWrC,KAAKJ,EAAI,IAAMI,KAAKH,EAAI,KAI1CyC,UAAiB3C,oBC1KrB,SAAS4C,EAAS3C,EAAGC,GACjBC,OAAOC,iBAAiBC,KAAM,GACrB,CACDC,WAAaC,IAANN,EAAkBA,EAAI,EAC7BO,UAAU,EACVC,YAAY,EACZC,cAAc,KAEb,CACDJ,WAAaC,IAANL,EAAkBA,EAAI,EAC7BM,UAAU,EACVC,YAAY,EACZC,cAAc,KAY1BkC,EAASC,WAAa,SAASC,EAAIC,UACxB,IAAIH,EACPG,EAAG9C,EAAI6C,EAAG7C,EACV8C,EAAG7C,EAAI4C,EAAG5C,IASlB0C,EAASjC,UAAUqC,OAAS,kBACjBzB,KAAKQ,KAAK1B,KAAKJ,EAAEI,KAAKJ,EAAII,KAAKH,EAAEG,KAAKH,IAQjD0C,EAASjC,UAAUsC,UAAY,kBACpB5C,KAAKJ,EAAEI,KAAKJ,EAAII,KAAKH,EAAEG,KAAKH,GASvC0C,EAASjC,UAAUuC,IAAM,SAASnC,UACvBV,KAAKJ,EAAEc,EAAKd,EAAII,KAAKH,EAAEa,EAAKb,GASvC0C,EAASjC,UAAUwC,MAAQ,SAASpC,UACzBV,KAAKJ,EAAEc,EAAKb,EAAIG,KAAKH,EAAEa,EAAKd,GASvC2C,EAASjC,UAAUyC,YAAc,SAASrC,UAC/BV,KAAKJ,EAAEc,EAAKb,EAAIG,KAAKH,EAAEa,EAAKd,GAQvC2C,EAASjC,UAAU0C,KAAO,kBACfhD,KAAKc,OAAQd,KAAK2C,WAS7BJ,EAASjC,UAAUG,IAAM,SAASC,UACvB,IAAIV,KAAKQ,YAAYR,KAAKJ,EAAIc,EAAKd,EAAGI,KAAKH,EAAIa,EAAKb,IAS/D0C,EAASjC,UAAUK,SAAW,SAASD,UAC5B,IAAIV,KAAKQ,YAAYR,KAAKJ,EAAIc,EAAKd,EAAGI,KAAKH,EAAIa,EAAKb,IAS/D0C,EAASjC,UAAUM,SAAW,SAASC,UAC5B,IAAIb,KAAKQ,YAAYR,KAAKJ,EAAIiB,EAAQb,KAAKH,EAAIgB,IAS1D0B,EAASjC,UAAUQ,OAAS,SAASD,UAC1B,IAAIb,KAAKQ,YAAYR,KAAKJ,EAAIiB,EAAQb,KAAKH,EAAIgB,IAS1D0B,EAASjC,UAAU2C,aAAe,SAASvC,OACnCwC,EAAMlD,KAAK6C,IAAInC,IAASV,KAAK2C,SAAWjC,EAAKiC,UACjDO,EAAMhC,KAAKU,KAAK,EAAGV,KAAKS,IAAIuB,EAAK,QAC7BC,EAAUjC,KAAKkC,KAAKF,UAEhBlD,KAAK8C,MAAMpC,GAAQ,GAAQyC,EAAUA,GAQjDZ,EAASjC,UAAU+C,KAAO,kBACf,IAAIrD,KAAKQ,aAAaR,KAAKH,EAAGG,KAAKJ,IAU9C2C,EAASjC,UAAUgD,cAAgB,SAAS5C,UACjCV,KAAKW,SAASX,KAAKuD,QAAQ7C,KAStC6B,EAASjC,UAAUiD,QAAU,SAAS7C,OAC9B8C,EAAUxD,KAAK6C,IAAInC,GAAQA,EAAKmC,IAAInC,UAEjCA,EAAKE,SAAS4C,IASzBjB,EAASjC,UAAUuB,UAAY,SAASC,UAC7B,IAAI9B,KAAKQ,YACZsB,EAAOC,EAAI/B,KAAKJ,EAAIkC,EAAOE,EAAIhC,KAAKH,EACpCiC,EAAOI,EAAIlC,KAAKJ,EAAIkC,EAAOK,EAAInC,KAAKH,IAU5C0C,EAASjC,UAAUS,OAAS,SAASL,UAE7BV,KAAKJ,IAAMc,EAAKd,GAChBI,KAAKH,IAAMa,EAAKb,GAWxB0C,EAASjC,UAAUU,gBAAkB,SAASN,EAAMO,UAE5CC,KAAKC,IAAInB,KAAKJ,EAAIc,EAAKd,GAAKqB,GAC5BC,KAAKC,IAAInB,KAAKH,EAAIa,EAAKb,GAAKoB,GASpCsB,EAASjC,UAAU+B,SAAW,iBACnB,UAAYrC,KAAKJ,EAAI,IAAMI,KAAKH,EAAI,KAI3CyC,UAAiBC,oBCzOrB,SAASkB,EAAoBC,EAAQC,EAAU1D,GAC3CH,OAAO8D,eAAeF,EAAQC,EAAU,CACpC1D,MAAOA,EACPE,UAAU,EACVC,YAAY,EACZC,cAAc,IA4BtB,SAASwD,EAAS9B,EAAGG,EAAGF,EAAGG,EAAGF,EAAGG,GAC7BqB,EAAoBzD,KAAM,SAAYE,IAAN6B,EAAmBA,EAAI,GACvD0B,EAAoBzD,KAAM,SAAYE,IAANgC,EAAmBA,EAAI,GACvDuB,EAAoBzD,KAAM,SAAYE,IAAN8B,EAAmBA,EAAI,GACvDyB,EAAoBzD,KAAM,SAAYE,IAANiC,EAAmBA,EAAI,GACvDsB,EAAoBzD,KAAM,SAAYE,IAAN+B,EAAmBA,EAAI,GACvDwB,EAAoBzD,KAAM,SAAYE,IAANkC,EAAmBA,EAAI,GAzB3DqB,EAAoBI,EAAU,WAAY,IAAIA,EAAS,EAAG,EAAG,EAAG,EAAG,EAAG,IACtEJ,EAAoBI,EAASC,SAAU,aAAc,kBAAqB,IAqC1ED,EAASE,YAAc,SAASC,EAAIC,UACzB,IAAIJ,EAAS,EAAG,EAAG,EAAG,EAAGG,EAAIC,IASxCJ,EAASK,QAAU,SAASC,UACjB,IAAIN,EAASM,EAAO,EAAG,EAAGA,EAAO,EAAG,IAU/CN,EAASO,UAAY,SAASD,EAAOE,UAC1B,IAAIR,EACPM,EACA,EACA,EACAA,EACAE,EAAOzE,EAAIyE,EAAOzE,EAAIuE,EACtBE,EAAOxE,EAAIwE,EAAOxE,EAAIsE,IAY9BN,EAASS,kBAAoB,SAASC,EAAQC,UACnC,IAAIX,EAASU,EAAQ,EAAG,EAAGC,EAAQ,EAAG,IAWjDX,EAASY,oBAAsB,SAASF,EAAQC,EAAQH,UAC7C,IAAIR,EACPU,EACA,EACA,EACAC,EACAH,EAAOzE,EAAIyE,EAAOzE,EAAI2E,EACtBF,EAAOxE,EAAIwE,EAAOxE,EAAI2E,IAU9BX,EAASa,SAAW,SAASvB,OACrBnB,EAAId,KAAKgC,IAAIC,GACbwB,EAAIzD,KAAK0D,IAAIzB,UAEV,IAAIU,EAAS7B,EAAG2C,GAAIA,EAAG3C,EAAG,EAAG,IAUxC6B,EAASgB,WAAa,SAAS1B,EAASkB,OAChCrC,EAAId,KAAKgC,IAAIC,GACbwB,EAAIzD,KAAK0D,IAAIzB,UAEV,IAAIU,EACP7B,EACA2C,GACCA,EACD3C,EACAqC,EAAOzE,EAAIyE,EAAOzE,EAAIoC,EAAIqC,EAAOxE,EAAI8E,EACrCN,EAAOxE,EAAIwE,EAAOxE,EAAImC,EAAIqC,EAAOzE,EAAI+E,IAU7Cd,EAASiB,mBAAqB,SAASC,OAC/B/B,EAAO+B,EAAO/B,OACdhB,EAAIgB,EAAKpD,EACT+E,EAAI3B,EAAKnD,SAEN,IAAIgE,EAAS7B,EAAG2C,GAAIA,EAAG3C,EAAG,EAAG,IAQxC6B,EAASmB,MAAQ,kBACN,IAAInB,GAAU,EAAG,EAAG,EAAG,EAAG,EAAG,IAQxCA,EAASoB,MAAQ,kBACN,IAAIpB,EAAS,EAAG,EAAG,GAAI,EAAG,EAAG,IASxCA,EAASqB,MAAQ,SAAS/B,UAGf,IAAIU,EAAS,EAAG,EAFf3C,KAAKiE,IAAIhC,GAEY,EAAG,EAAG,IASvCU,EAASuB,MAAQ,SAASjC,UAGf,IAAIU,EAAS,EAFZ3C,KAAKiE,IAAIhC,GAES,EAAG,EAAG,EAAG,IAYvCU,EAASvD,UAAUM,SAAW,SAAUF,UAChCV,KAAKqF,aACE3E,EAGPA,EAAK2E,aACErF,KAGJ,IAAIA,KAAKQ,YACZR,KAAK+B,EAAIrB,EAAKqB,EAAI/B,KAAKgC,EAAItB,EAAKwB,EAChClC,KAAKkC,EAAIxB,EAAKqB,EAAI/B,KAAKmC,EAAIzB,EAAKwB,EAChClC,KAAK+B,EAAIrB,EAAKsB,EAAIhC,KAAKgC,EAAItB,EAAKyB,EAChCnC,KAAKkC,EAAIxB,EAAKsB,EAAIhC,KAAKmC,EAAIzB,EAAKyB,EAChCnC,KAAK+B,EAAIrB,EAAKuB,EAAIjC,KAAKgC,EAAItB,EAAK0B,EAAIpC,KAAKiC,EACzCjC,KAAKkC,EAAIxB,EAAKuB,EAAIjC,KAAKmC,EAAIzB,EAAK0B,EAAIpC,KAAKoC,IASjDyB,EAASvD,UAAUgF,QAAU,cACrBtF,KAAKqF,oBACErF,SAGPuF,EAAOvF,KAAK+B,EAAI/B,KAAKmC,EAAInC,KAAKkC,EAAIlC,KAAKgC,KAE7B,IAATuD,OACK,+BAGNC,EAAO,EAAMD,EACbE,EAAOzF,KAAKoC,EAAIpC,KAAKgC,EAAIhC,KAAKiC,EAAIjC,KAAKmC,EACvCuD,EAAO1F,KAAKiC,EAAIjC,KAAKkC,EAAIlC,KAAKoC,EAAIpC,KAAK+B,SAEpC,IAAI/B,KAAKQ,YACZR,KAAKmC,EAAIqD,GACTxF,KAAKkC,EAAIsD,GACTxF,KAAKgC,EAAIwD,EACTxF,KAAK+B,EAAIyD,EACPC,EAAOD,EACPE,EAAOF,IAWjB3B,EAASvD,UAAUqF,UAAY,SAAS3B,EAAIC,UACjC,IAAIjE,KAAKQ,YACZR,KAAK+B,EACL/B,KAAKkC,EACLlC,KAAKgC,EACLhC,KAAKmC,EACLnC,KAAK+B,EAAIiC,EAAKhE,KAAKgC,EAAIiC,EAAKjE,KAAKiC,EACjCjC,KAAKkC,EAAI8B,EAAKhE,KAAKmC,EAAI8B,EAAKjE,KAAKoC,IAUzCyB,EAASvD,UAAU6D,MAAQ,SAASA,UACzB,IAAInE,KAAKQ,YACZR,KAAK+B,EAAIoC,EACTnE,KAAKkC,EAAIiC,EACTnE,KAAKgC,EAAImC,EACTnE,KAAKmC,EAAIgC,EACTnE,KAAKiC,EACLjC,KAAKoC,IAWbyB,EAASvD,UAAUsF,QAAU,SAASzB,EAAOE,OACrC7C,EAAK6C,EAAOzE,EAAIuE,EAAQE,EAAOzE,EAC/B6B,EAAK4C,EAAOxE,EAAIsE,EAAQE,EAAOxE,SAE5B,IAAIG,KAAKQ,YACZR,KAAK+B,EAAIoC,EACTnE,KAAKkC,EAAIiC,EACTnE,KAAKgC,EAAImC,EACTnE,KAAKmC,EAAIgC,EACTnE,KAAK+B,EAAIP,EAAKxB,KAAKgC,EAAIP,EAAKzB,KAAKiC,EACjCjC,KAAKkC,EAAIV,EAAKxB,KAAKmC,EAAIV,EAAKzB,KAAKoC,IAWzCyB,EAASvD,UAAUuF,gBAAkB,SAAStB,EAAQC,UAC3C,IAAIxE,KAAKQ,YACZR,KAAK+B,EAAIwC,EACTvE,KAAKkC,EAAIqC,EACTvE,KAAKgC,EAAIwC,EACTxE,KAAKmC,EAAIqC,EACTxE,KAAKiC,EACLjC,KAAKoC,IAYbyB,EAASvD,UAAUwF,kBAAoB,SAASvB,EAAQC,EAAQH,OACxD7C,EAAK6C,EAAOzE,EAAI2E,EAASF,EAAOzE,EAChC6B,EAAK4C,EAAOxE,EAAI2E,EAASH,EAAOxE,SAE7B,IAAIG,KAAKQ,YACZR,KAAK+B,EAAIwC,EACTvE,KAAKkC,EAAIqC,EACTvE,KAAKgC,EAAIwC,EACTxE,KAAKmC,EAAIqC,EACTxE,KAAK+B,EAAIP,EAAKxB,KAAKgC,EAAIP,EAAKzB,KAAKiC,EACjCjC,KAAKkC,EAAIV,EAAKxB,KAAKmC,EAAIV,EAAKzB,KAAKoC,IAUzCyB,EAASvD,UAAUyF,OAAS,SAAS5C,OAC7BnB,EAAId,KAAKgC,IAAIC,GACbwB,EAAIzD,KAAK0D,IAAIzB,UAEV,IAAInD,KAAKQ,YACZR,KAAK+B,EAAKC,EAAIhC,KAAKgC,EAAI2C,EACvB3E,KAAKkC,EAAKF,EAAIhC,KAAKmC,EAAIwC,EACvB3E,KAAK+B,GAAK4C,EAAI3E,KAAKgC,EAAIA,EACvBhC,KAAKkC,GAAKyC,EAAI3E,KAAKmC,EAAIH,EACvBhC,KAAKiC,EACLjC,KAAKoC,IAWbyB,EAASvD,UAAU0F,SAAW,SAAS7C,EAASkB,OACxCnB,EAAMhC,KAAKgC,IAAIC,GACfyB,EAAM1D,KAAK0D,IAAIzB,GACf8C,EAAK5B,EAAOzE,EACZsG,EAAK7B,EAAOxE,EAEZkC,EAAI/B,KAAK+B,EAAImB,EAAMlD,KAAKgC,EAAI4C,EAC5B1C,EAAIlC,KAAKkC,EAAIgB,EAAMlD,KAAKmC,EAAIyC,EAC5B5C,EAAIhC,KAAKgC,EAAIkB,EAAMlD,KAAK+B,EAAI6C,EAC5BzC,EAAInC,KAAKmC,EAAIe,EAAMlD,KAAKkC,EAAI0C,SAEzB,IAAI5E,KAAKQ,YACZuB,EACAG,EACAF,EACAG,GACCnC,KAAK+B,EAAIA,GAAKkE,GAAMjG,KAAKgC,EAAIA,GAAKkE,EAAKlG,KAAKiC,GAC5CjC,KAAKkC,EAAIA,GAAK+D,GAAMjG,KAAKmC,EAAIA,GAAK+D,EAAKlG,KAAKoC,IAUrDyB,EAASvD,UAAU6F,iBAAmB,SAASpB,OACvC/B,EAAO+B,EAAO/B,OACdhB,EAAIgB,EAAKpD,EACT+E,EAAI3B,EAAKnD,SAEN,IAAIG,KAAKQ,YACZR,KAAK+B,EAAKC,EAAIhC,KAAKgC,EAAI2C,EACvB3E,KAAKkC,EAAKF,EAAIhC,KAAKmC,EAAIwC,EACvB3E,KAAK+B,GAAK4C,EAAI3E,KAAKgC,EAAIA,EACvBhC,KAAKkC,GAAKyC,EAAI3E,KAAKmC,EAAIH,EACvBhC,KAAKiC,EACLjC,KAAKoC,IASbyB,EAASvD,UAAU8F,MAAQ,kBAChB,IAAIpG,KAAKQ,aACXR,KAAK+B,GACL/B,KAAKkC,EACLlC,KAAKgC,EACLhC,KAAKmC,EACLnC,KAAKiC,EACLjC,KAAKoC,IASdyB,EAASvD,UAAU+F,MAAQ,kBAChB,IAAIrG,KAAKQ,YACXR,KAAK+B,EACL/B,KAAKkC,GACLlC,KAAKgC,GACLhC,KAAKmC,EACLnC,KAAKiC,EACLjC,KAAKoC,IAUdyB,EAASvD,UAAUgG,MAAQ,SAASnD,OAC5B9B,EAAIH,KAAKiE,IAAIhC,UAEV,IAAInD,KAAKQ,YACZR,KAAK+B,EACL/B,KAAKkC,EACLlC,KAAKgC,EAAIhC,KAAK+B,EAAIV,EAClBrB,KAAKmC,EAAInC,KAAKkC,EAAIb,EAClBrB,KAAKiC,EACLjC,KAAKoC,IAYbyB,EAASvD,UAAUiG,MAAQ,SAASpD,OAC5B9B,EAAIH,KAAKiE,IAAIhC,UAEV,IAAInD,KAAKQ,YACZR,KAAK+B,EAAI/B,KAAKgC,EAAIX,EAClBrB,KAAKkC,EAAIlC,KAAKmC,EAAId,EAClBrB,KAAKgC,EACLhC,KAAKmC,EACLnC,KAAKiC,EACLjC,KAAKoC,IAWbyB,EAASvD,UAAU+E,WAAa,kBAEb,IAAXrF,KAAK+B,GACM,IAAX/B,KAAKkC,GACM,IAAXlC,KAAKgC,GACM,IAAXhC,KAAKmC,GACM,IAAXnC,KAAKiC,GACM,IAAXjC,KAAKoC,GASbyB,EAASvD,UAAUkG,aAAe,kBACvBxG,KAAK+B,EAAI/B,KAAKmC,EAAInC,KAAKkC,EAAIlC,KAAKgC,GAAM,GAQjD6B,EAASvD,UAAUmG,SAAW,iBACnB,CACHlC,OAAQrD,KAAKQ,KAAK1B,KAAK+B,EAAI/B,KAAK+B,EAAI/B,KAAKgC,EAAIhC,KAAKgC,GAClDwC,OAAQtD,KAAKQ,KAAK1B,KAAKkC,EAAIlC,KAAKkC,EAAIlC,KAAKmC,EAAInC,KAAKmC,KAiB1D0B,EAASvD,UAAUoG,iBAAmB,eAC9BC,EAA6B,IAAnB3G,KAAK+B,EAAI/B,KAAKmC,GACxByE,EAA6B,IAAnB5G,KAAK+B,EAAI/B,KAAKmC,GACxB0E,EAA6B,IAAnB7G,KAAKkC,EAAIlC,KAAKgC,GACxB8E,EAA6B,IAAnB9G,KAAKkC,EAAIlC,KAAKgC,GAExB+E,EAAS7F,KAAKQ,KAAKiF,EAAIA,EAAIG,EAAIA,GAC/BE,EAAS9F,KAAKQ,KAAKkF,EAAIA,EAAIC,EAAIA,GAC/BtC,EAASwC,EAAIC,EACbxC,EAASuC,EAAIC,EAEbC,EAAS/F,KAAKgG,MAAML,EAAGD,GACvBO,EAASjG,KAAKgG,MAAMJ,EAAGH,GACvBS,EAAqB,IAAXD,EAAKF,GACfI,EAAqB,IAAXF,EAAKF,SAKZ,CACHlD,YAAa,IAAI/D,KAAKQ,YAAY,EAAG,EAAG,EAAG,EAAGR,KAAKiC,EAAGjC,KAAKoC,GAC3DsC,SAAa1E,KAAKQ,YAAYsD,SAASiC,OAAOsB,GAC9ClD,MAAa,IAAInE,KAAKQ,YAAY+D,EAAQ,EAAG,EAAGC,EAAQ,EAAG,GAC3D8C,UAAatH,KAAKQ,YAAYsD,SAASiC,OAAOqB,KAUtDvD,EAASvD,UAAUS,OAAS,SAASL,UAE7BV,KAAK+B,IAAMrB,EAAKqB,GAChB/B,KAAKkC,IAAMxB,EAAKwB,GAChBlC,KAAKgC,IAAMtB,EAAKsB,GAChBhC,KAAKmC,IAAMzB,EAAKyB,GAChBnC,KAAKiC,IAAMvB,EAAKuB,GAChBjC,KAAKoC,IAAM1B,EAAK0B,GAWxByB,EAASvD,UAAUU,gBAAkB,SAASN,EAAMO,UAE5CC,KAAKC,IAAInB,KAAK+B,EAAIrB,EAAKqB,GAAKd,GAC5BC,KAAKC,IAAInB,KAAKkC,EAAIxB,EAAKwB,GAAKjB,GAC5BC,KAAKC,IAAInB,KAAKgC,EAAItB,EAAKsB,GAAKf,GAC5BC,KAAKC,IAAInB,KAAKmC,EAAIzB,EAAKyB,GAAKlB,GAC5BC,KAAKC,IAAInB,KAAKiC,EAAIvB,EAAKuB,GAAKhB,GAC5BC,KAAKC,IAAInB,KAAKoC,EAAI1B,EAAK0B,GAAKnB,GASpC4C,EAASvD,UAAU+B,SAAW,iBACnB,UAAY,CAACrC,KAAK+B,EAAG/B,KAAKkC,EAAGlC,KAAKgC,EAAGhC,KAAKmC,EAAGnC,KAAKiC,EAAGjC,KAAKoC,GAAGmF,KAAK,KAAO,KAIhFjF,UAAiBuB,MCpnBH2D,IACCA,IACAA,kBCkFnB,SAASC,SACAC,KAAMC,WA5EfF,EAAWG,UAAY,KACvBH,EAAWI,SAAY,GAgBvBJ,EAAWK,YAAc,SAASC,EAAIC,EAAIC,EAAGC,EAAQtI,MAC5CmI,EAAGvH,cAAgB2H,OAASH,EAAGxH,cAAgB2H,YAC1C,IAAIC,MAAM,uDAEfC,MAAMJ,IAAMI,MAAMH,IAAWG,MAAMzI,SAC9B,IAAIwI,MAAM,oEAGhBvI,EAAK,EACL4B,EAAK,EACLO,EAAI,IAAImG,MAAMF,GACd9F,EAAI,IAAIgG,MAAMF,GACdK,EAAK,EAELC,EAAOrH,KAAKC,IAAIvB,EAAImI,EAAGG,IAEjBM,EAAI,EAAGA,EAAIP,EAAGO,IAAM,KACtBC,EAAOvH,KAAKC,IAAIvB,EAAImI,EAAGG,EAAOM,IAE7BC,EAAOF,IACRD,EAAKE,EACLD,EAAOE,GAEXzG,EAAEwG,GAAKrG,EAAEqG,GAAKR,EAAGE,EAAOM,GAG5B3I,EAAImI,EAAGE,EAAOI,GACdA,QAEM,IAAII,EAAI,EAAGA,EAAIT,EAAGS,IAAM,KAChBF,EAAI,EAAGA,EAAIP,EAAES,EAAGF,IAAM,KACxBG,EAAKZ,EAAGG,EAAOM,GAAK5I,EACpBgJ,EAAKb,EAAGG,EAAOM,EAAEE,GAAK9I,EACtBiJ,EAAI7G,EAAEwG,EAAE,GAAGrG,EAAEqG,GACbM,EAAMH,EAAKC,KAEH,GAAPE,QACK,IAAIV,MAAM,0FAGpBU,EAAMD,EAAIC,EACV3G,EAAEqG,GAAKI,EAAGE,EACV9G,EAAEwG,GAAKG,EAAGG,EAIdjJ,GADA4B,EAAM,GAAG6G,EAAG,GAAML,EAAES,EAAM1G,EAAEsG,EAAG,GAAKnG,EAAEmG,WAInC,CAAEzI,EAAGA,EAAG4B,GAAIA,IAiBvBgG,EAAWnH,UAAUoH,KAAO,SAASqB,QAC5BA,MAAQ,IAAIZ,UAEX,IAAIK,EAAIO,EAAMpG,OAAS,EAAG6F,GAAK,EAAGA,SAC/BO,MAAMC,KAAMD,EAAMP,SAEtBS,UAAY,SACZC,GAAK,GAOdzB,EAAWnH,UAAU6I,KAAO,SAASvJ,MAC5ByI,MAAMzI,SACD,IAAIwI,MAAM,uDAGhBgB,EAAS,EAEHZ,EAAIxI,KAAK+I,MAAMpG,OAAS,EAAG6F,GAAK,EAAGA,IACzCY,EAASA,EAASxJ,EAAII,KAAK+I,MAAMP,UAG9BY,GAOX3B,EAAWnH,UAAUG,IAAM,SAASC,WAC5B0I,EAAS,IAAI3B,EACb4B,EAAKrJ,KAAKsJ,YACVC,EAAK7I,EAAK4I,YACVE,EAAOtI,KAAKU,IAAIyH,EAAGE,GAEbf,EAAI,EAAGA,GAAKgB,EAAMhB,IAAM,KAC1BiB,EAAMjB,GAAKa,EAAMrJ,KAAK+I,MAAMP,GAAK,EACjCkB,EAAMlB,GAAKe,EAAM7I,EAAKqI,MAAMP,GAAK,EAErCY,EAAOL,MAAMP,GAAKiB,EAAKC,SAGpBN,GAOX3B,EAAWnH,UAAUM,SAAW,SAASF,WACjC0I,EAAS,IAAI3B,EAEPe,EAAI,EAAGA,GAAKxI,KAAKsJ,YAAc5I,EAAK4I,YAAad,IACvDY,EAAOL,MAAMC,KAAK,OAGZR,EAAI,EAAGA,GAAKxI,KAAKsJ,YAAad,QAC9B,IAAImB,EAAI,EAAGA,GAAKjJ,EAAK4I,YAAaK,IACpCP,EAAOL,MAAMP,EAAEmB,IAAM3J,KAAK+I,MAAMP,GAAK9H,EAAKqI,MAAMY,UAIjDP,GAOX3B,EAAWnH,UAAUsJ,cAAgB,SAAS/I,OACpC,IAAI2H,EAAI,EAAGA,EAAIxI,KAAK+I,MAAMpG,OAAQ6F,SAC/BO,MAAMP,IAAM3H,GAQzB4G,EAAWnH,UAAUuJ,SAAW,SAASjC,QACnB1H,IAAd0H,IAAyBA,EAAY,WAEnC,IAAIY,EAAIxI,KAAKsJ,YAAad,GAAK,GAC5BtH,KAAKC,IAAKnB,KAAK+I,MAAMP,KAAQZ,EADEY,SAE3BO,MAAMe,OAYvBrC,EAAWnH,UAAUyJ,UAAY,SAASpI,EAAKC,OAGvCwH,EAFAY,EAAWhK,KAAKmJ,KAAKxH,GACrBsI,EAAWjK,KAAKmJ,KAAKvH,MAGpBV,KAAKC,IAAI6I,IAAavC,EAAWG,UAClCwB,EAASzH,OAER,GAAKT,KAAKC,IAAI8I,IAAaxC,EAAWG,UACvCwB,EAASxH,OAER,GAAKoI,EAAWC,GAAY,UACzBC,EAAQhJ,KAAKiJ,IAAIvI,EAAMD,GACvByI,EAAQlJ,KAAKmJ,KAAO5C,EAAWI,SAC/ByC,EAAQpJ,KAAKqJ,MAAOL,EAAKE,GAAQlJ,KAAKsJ,KAEhChC,EAAI,EAAGA,EAAI8B,EAAO9B,IAAM,CAC9BY,EAAS,IAAOzH,EAAMC,OAClB3B,EAAQD,KAAKmJ,KAAKC,MAEjBlI,KAAKC,IAAIlB,IAAUwH,EAAWG,gBAI9B3H,EAAQ+J,EAAW,GACpBpI,EAAMwH,EACNa,EAAWhK,IAGX0B,EAAMyH,EACNY,EAAW/J,UAKhBmJ,GAOX3B,EAAWnH,UAAU+B,SAAW,mBACxB0G,EAAQ,IAAIZ,MACZsC,EAAQ,IAAItC,MAENK,EAAIxI,KAAK+I,MAAMpG,OAAS,EAAG6F,GAAK,EAAGA,IAAM,KAC3CvI,EAAQiB,KAAKwJ,MAAoB,IAAd1K,KAAK+I,MAAMP,IAAS,OAG7B,GAATvI,EAAa,KACV0K,EAAS1K,EAAQ,EAAM,MAAQ,MAEnCA,EAAQiB,KAAKC,IAAIlB,GAEZuI,EAAI,IACS,GAATvI,EACDA,EAAQD,KAAKiJ,UAGbhJ,GAASD,KAAKiJ,WAIjBT,EAAI,IACLvI,GAAS,IAAMuI,GAGnBiC,EAAMzB,KAAM2B,GACZ5B,EAAMC,KAAM/I,IAIpBwK,EAAM,GAAmB,OAAZA,EAAM,GAAgB,GAAK,QAEpCrB,EAAS,OAEHZ,EAAI,EAAGA,EAAIO,EAAMpG,OAAQ6F,IAC/BY,GAAUqB,EAAMjC,GAAKO,EAAMP,UAGxBY,GASX3B,EAAWnH,UAAUsK,UAAY,SAASjJ,EAAKC,EAAKqG,MAC3CI,MAAM1G,IAAQ0G,MAAMzG,IAAQyG,MAAMJ,SAC7B,IAAIG,MAAM,wDAGhByC,EAAQjJ,EAAMD,KAGR,GAALsG,EAAS,KACN+B,EAAWhK,KAAKmJ,KAAKxH,GACrBsI,EAAWjK,KAAKmJ,KAAKvH,QAEpBsH,GAAK,GAAI2B,GAAQb,EAAWC,OAEhC,SACGa,EAAK,GAAM7C,EAAE,EACb8C,EAAQF,EAAQC,EAChBlL,EAAI+B,EAAM,GAAIoJ,EACdC,EAAM,EAEAxC,EAAI,EAAGA,EAAIsC,EAAItC,IACrBwC,GAAOhL,KAAKmJ,KAAKvJ,GACjBA,GAAKmL,OAGJ7B,GAAK,IAAKlJ,KAAKkJ,GAAK2B,EAAMG,EAAIF,MAGlCzC,MAAMrI,KAAKkJ,UACN,IAAId,MAAM,+CAGbpI,KAAKkJ,IAShBzB,EAAWnH,UAAU2K,QAAU,SAAStJ,EAAKC,MACpCyG,MAAM1G,IAAQ0G,MAAMzG,SACf,IAAIwG,MAAM,0DAGhByC,EAAQjJ,EAAMD,EACduJ,EAAK,GAAML,GAAU7K,KAAKmJ,KAAKxH,GAAO3B,KAAKmJ,KAAKvH,IAChDP,EAAI6J,EACJvG,EAAI,EAAIuG,EAAG,EACXC,EAAKxG,EACLyG,EAAMF,EAGNJ,EAAK,EAEC7C,EAAI,EAAGA,GAAK,GAAIA,IAAM,SACxB8C,EAAQF,EAAQC,EAChBlL,EAAQ+B,EAAM,GAAIoJ,EAClBC,EAAQ,EAEFxC,EAAI,EAAGA,GAAKsC,EAAItC,IACtBwC,GAAOhL,KAAKmJ,KAAKvJ,GACjBA,GAAKmL,KAKTpG,GAAK,GADLuG,EADA7J,EAAI,IAAOA,EAAIwJ,EAAQG,EAAMF,IAEfM,GAAK,EAEdlK,KAAKC,IAAIwD,EAAEwG,GAlBJ,KAkBoBjK,KAAKC,IAAIgK,SAIzCA,EAAKxG,EACLyG,EAAMF,EACNJ,IAAO,SAGJnG,GAOX8C,EAAWnH,UAAU+K,QAAU,SAAS1J,EAAKC,MACpCyG,MAAM1G,IAAQ0G,MAAMzG,SACf,IAAIwG,MAAM,sDAMhBzD,EAAI,IAAIwD,MAAMmD,IACdC,EAAI,IAAIpD,MAAMmD,IACdlC,EAAS,CAAEvJ,EAAG,EAAG4B,GAAI,GAEzB8J,EAAE,GAAK,MAED,IAAI5B,EAAI,EAAGA,GATP,KAUNhF,EAAEgF,EAAE,GAAK3J,KAAK4K,UAAUjJ,EAAKC,EAAK+H,KAE7BA,GAXD,IAYAP,EAAS3B,EAAWK,YAAYyD,EAAG5G,EAZnC,EAYyCgF,EAZzC,EAY8C,GACzCzI,KAAKC,IAAIiI,EAAO3H,KAZb,KAY8B2H,EAAOvJ,KAL1B8J,IAQvBhF,EAAEgF,GAAKhF,EAAEgF,EAAE,GACX4B,EAAE5B,GAAK,IAAO4B,EAAE5B,EAAE,UAGfP,EAAOvJ,GAQlB4H,EAAWnH,UAAUgJ,UAAY,kBACtBtJ,KAAK+I,MAAMpG,OAAS,GAO/B8E,EAAWnH,UAAUkL,cAAgB,mBAC7BC,EAAa,IAAIhE,EAEXe,EAAI,EAAGA,EAAIxI,KAAK+I,MAAMpG,OAAQ6F,IACpCiD,EAAW1C,MAAMC,KAAKR,EAAExI,KAAK+I,MAAMP,WAGhCiD,GAOXhE,EAAWnH,UAAUoL,SAAW,eACxBtC,cAECS,WAEI7J,KAAKsJ,kBACL,EAAGF,EAAS,cACZ,EAAGA,EAASpJ,KAAK2L,2BACjB,EAAGvC,EAASpJ,KAAK4L,+BACjB,EAAGxC,EAASpJ,KAAK6L,2BACjB,EAAGzC,EAASpJ,KAAK8L,gCAElB1C,EAAS,UAGVA,GAOX3B,EAAWnH,UAAUyL,mBAAqB,SAASpK,EAAKC,OAEhDoK,EADAC,EAAQ,IAAI9D,SAGS,GAApBnI,KAAKsJ,YAGO,OAFb0C,EAAOhM,KAAK+J,UAAUpI,EAAKC,KAGvBqK,EAAMjD,KAAKgD,OAGd,KAGGE,EADSlM,KAAKwL,gBACCO,mBAAmBpK,EAAKC,MAEtCsK,EAAOvJ,OAAS,EAAI,KAIR,OAFbqJ,EAAOhM,KAAK+J,UAAUpI,EAAKuK,EAAO,MAG9BD,EAAMjD,KAAKgD,GAITxD,EAAI,EAAGA,GAAK0D,EAAOvJ,OAAO,EAAG6F,IAGlB,OAFbwD,EAAOhM,KAAK+J,UAAUmC,EAAO1D,GAAI0D,EAAO1D,EAAE,MAGtCyD,EAAMjD,KAAKgD,GAON,OAFbA,EAAOhM,KAAK+J,UAAUmC,EAAOA,EAAOvJ,OAAO,GAAIf,KAG3CqK,EAAMjD,KAAKgD,QAOF,OAFbA,EAAOhM,KAAK+J,UAAUpI,EAAKC,KAGvBqK,EAAMjD,KAAKgD,UAKhBC,GAOXxE,EAAWnH,UAAUqL,cAAgB,eAC7BvC,EAAS,GACTrH,EAAI/B,KAAK+I,MAAM,UAET,GAALhH,GACDqH,EAAOJ,MAAOhJ,KAAK+I,MAAM,GAAKhH,GAG3BqH,GAOX3B,EAAWnH,UAAUsL,kBAAoB,eACjCO,EAAU,MAEW,GAApBnM,KAAKsJ,YAAmB,KACrBvH,EAAI/B,KAAK+I,MAAM,GACf7G,EAAIlC,KAAK+I,MAAM,GAAKhH,EAEpBI,EAAID,EAAEA,EAAI,GADNlC,KAAK+I,MAAM,GAAKhH,MAGnBI,EAAI,EAAI,KACLF,EAAIf,KAAKQ,KAAKS,GAElBgK,EAAQnD,KAAM,KAAQ9G,EAAID,IAC1BkK,EAAQnD,KAAM,KAAQ9G,EAAID,SAEf,GAALE,GAENgK,EAAQnD,KAAM,IAAO9G,UAItBiK,GAWX1E,EAAWnH,UAAUuL,cAAgB,eAC7BM,EAAU,MAEW,GAApBnM,KAAKsJ,YAAmB,KACrB8C,EAAKpM,KAAK+I,MAAM,GAChBsD,EAAKrM,KAAK+I,MAAM,GAAKqD,EACrBE,EAAKtM,KAAK+I,MAAM,GAAKqD,EAGrBrK,GAAW,EAAEuK,EAAKD,EAAGA,GAAM,EAC3BnK,GAAW,EAAEmK,EAAGA,EAAGA,EAAK,EAAEC,EAAGD,EAAK,IAH7BrM,KAAK+I,MAAM,GAAKqD,IAGsB,GAC3ClE,EAAUmE,EAAK,EACfE,EAAUrK,EAAEA,EAAE,EAAIH,EAAEA,EAAEA,EAAE,GACxByK,EAAUtK,EAAI,EAEduK,EAAczM,KAAK0M,uBACnBxL,KAAKC,IAAIoL,IAAYE,IACrBF,EAAU,GAGTA,EAAU,EAAI,KAGXP,EAFA/J,EAAIf,KAAKQ,KAAK6K,GAOdP,GAHJW,GAAOH,EAAQvK,IAEH,EACDf,KAAK0L,IAAID,EAAK,EAAE,IAGfzL,KAAK0L,KAAKD,EAAK,EAAE,IAG7BA,GAAOH,EAAQvK,IAEH,EACR+J,GAAQ9K,KAAK0L,IAAID,EAAK,EAAE,GAGxBX,GAAQ9K,KAAK0L,KAAKD,EAAK,EAAE,GAG7BR,EAAQnD,KAAMgD,EAAO9D,QAEpB,GAAKqE,EAAU,EAAI,KAChBM,EAAW3L,KAAKQ,MAAMK,EAAE,GACxB+K,EAAW5L,KAAKgG,MAAOhG,KAAKQ,MAAM6K,IAAWC,GAAS,EACtDtJ,EAAWhC,KAAKgC,IAAI4J,GACpBlI,EAAW1D,KAAK0D,IAAIkI,GACpBC,EAAW7L,KAAKQ,KAAK,GAEzByK,EAAQnD,KAAM,EAAE6D,EAAS3J,EAAMgF,GAC/BiE,EAAQnD,MAAO6D,GAAY3J,EAAM6J,EAAQnI,GAAOsD,GAChDiE,EAAQnD,MAAO6D,GAAY3J,EAAM6J,EAAQnI,GAAOsD,OAE/C,KACGyE,EAGAA,EADCH,GAAS,GACHtL,KAAK0L,IAAIJ,EAAO,EAAE,GAGnBtL,KAAK0L,KAAKJ,EAAO,EAAE,GAG7BL,EAAQnD,KAAM,EAAE2D,EAAMzE,GAEtBiE,EAAQnD,MAAO2D,EAAMzE,WAItBiE,GAOX,IAAIxB,EAAO,SAAU/K,SACG,iBAANA,EAAiBA,EAAIA,EAAI,GAAK,EAAI,EAAIA,GAAMA,EAAIA,EAAIoN,IAAMA,KAY5EvF,EAAWnH,UAAUwL,gBAAkB,eAC/BK,EAAU,GAEVlE,EAAIjI,KAAKsJ,eAEJ,GAALrB,EAAQ,KACJgF,EAAO,IAAIxF,EAEfwF,EAAKlE,MAAQ/I,KAAK+I,MAAMmE,QACxBD,EAAKrD,cAAcqD,EAAKlE,MAAMd,IAI1B/G,KAAKC,IAAI8L,EAAKlE,MAAM,IAAM,GAFnB,MAE+B7H,KAAKC,IAAI8L,EAAKlE,MAAM,MAC1DkE,EAAKlE,MAAM,GAAK,OAOhBP,EAJA2E,EAASF,EAAKzB,gBACd4B,EAAQD,EAAOzB,WAAW2B,KAAK,SAAUtL,EAAGG,UAAYH,EAAIG,IAC5DoL,EAAO,GACPC,EAAKH,EAAMzK,OAAS,EAEpB6K,EAAKxN,KAAKyN,SAEdC,QAAUxM,KAAKU,IAAIV,KAAKC,IAAIqM,EAAGG,MAAOzM,KAAKC,IAAIqM,EAAGI,WAE9CnB,EAAczM,KAAK0M,kBAAkBgB,aAEpClF,EAAI,EAAGA,GAAK+E,EAAI/E,IACjB8E,EAAKtE,KAAKiE,EAAK9D,KAAKiE,EAAM5E,SAGzBA,EAAI,EAAGA,GAAK+E,EAAI/E,IACbtH,KAAKC,IAAImM,EAAK9E,IAAMiE,IACpBa,EAAK9E,GAAK,GAIlBA,EAAI,MACAhH,EAAKN,KAAKU,IAAI,IAAO4L,EAAGI,KAAOJ,EAAGG,MAAQ1F,EA5BnC,OA6BP4F,EAAU,GACVC,EAAS,MAETP,GAAM,EAAG,KACM,GAAXD,EAAK,GACD3C,EAAK2C,EAAK,KAAO3C,EAAKsC,EAAK9D,KAAKiE,EAAM,GAAK5L,GAAM8L,EAAK,MACtDO,EAAQ7E,KAAKoE,EAAM,GAAK5L,GACxBsM,EAAO9E,KAAK,CAACwE,EAAGG,KAAMP,EAAM,OAIhCjB,EAAQnD,KAAKoE,EAAM,GAAIA,EAAM,IAC7B5E,KAGGA,EAAI+E,EAAI/E,IACQ,GAAf8E,EAAK9E,EAAI,IACT2D,EAAQnD,KAAKoE,EAAM5E,EAAI,GAAI4E,EAAM5E,EAAI,IACrCA,KAEKmC,EAAK2C,EAAK9E,KAAOmC,EAAK2C,EAAK9E,EAAI,MACpCqF,EAAQ7E,MAAMoE,EAAM5E,GAAK4E,EAAM5E,EAAI,IAAM,GACzCsF,EAAO9E,KAAK,CAACoE,EAAM5E,GAAI4E,EAAM5E,EAAI,MAGzB,GAAZ8E,EAAKC,IAAY5C,EAAK2C,EAAKC,KAAQ5C,EAAKsC,EAAK9D,KAAKiE,EAAMG,GAAM/L,GAAM8L,EAAKC,MACzEM,EAAQ7E,KAAKoE,EAAMG,GAAM/L,GACzBsM,EAAO9E,KAAK,CAACoE,EAAMG,GAAKC,EAAGI,YAI/BxL,EAAI,SAAUxC,UAAYqN,EAAK9D,KAAKvJ,IACpCmO,EAAK,SAAUnO,UAAYuN,EAAOhE,KAAKvJ,OAEvCiO,EAAQlL,OAAS,MACZ6F,EAAI,EAAGA,EAAIqF,EAAQlL,OAAQ6F,IAC5BqF,EAAQrF,GAAKf,EAAWuG,wBAAwBH,EAAQrF,GAAIpG,EAAG2L,EAAI,GAAID,EAAOtF,GAAG,GAAIsF,EAAOtF,GAAG,IAIvG2D,EAAUA,EAAQ8B,OAAOJ,UAGtB1B,GASX1E,EAAWnH,UAAUoM,kBAAoB,SAAUgB,WAIxB,IAAZA,EAAyB,KAC5BF,EAJGxN,KAIOyN,SACdC,EAAUxM,KAAKU,IAAIV,KAAKC,IAAIqM,EAAGG,MAAOzM,KAAKC,IAAIqM,EAAGI,UAGlDF,EAAU,YACH,EAAExM,KAAKC,IATPnB,KASgBmJ,KARhB,YAWPlB,EAZOjI,KAYE+I,MAAMpG,OAAS,EACxBuL,EAbOlO,KAaG+I,MAAMd,UAEb,GAdI,MADAjI,KAea+I,MAAMoF,OAAO,SAAUzF,EAAG0F,EAAG5F,OAC7C6F,EAAKD,EAAIF,EAAKhN,KAAK0L,IAAIc,EAASlF,UAC7B6F,EAAK3F,EAAI2F,EAAK3F,GACtB,IAWPjB,EAAWnH,UAAUgO,0BAA4B,eACzCvM,EAAI/B,KAAK+I,MACTd,EAAIlG,EAAEY,OAAS,EACfuL,EAAKnM,EAAEkG,GAED,GAANiG,IACAnM,EAAI/B,KAAK+I,MAAMwF,IAAI,SAAUH,UAClBA,EAAIF,SAUfM,EANAtM,EAAIH,EAAEwM,IAAI,SAAUH,EAAG5F,UACfA,EAAIP,EACN/G,KAAK0L,IAAI1L,KAAKC,IAAU,GAALqH,EAAU4F,EAAI,EAAIA,GAAI,GAAKnG,EAAIO,IAClD4F,IAINK,EAAW,SAAUC,EAAKC,EAAInG,UAC1BgG,EAAkBhG,KACdkG,EAAI9M,IAAM+M,GACVD,EAAIE,QAAUF,EAAI9M,IAClB8M,EAAI9M,IAAM+M,GAELD,EAAIE,QAAUD,IACnBD,EAAIE,QAAUD,IAGfD,GAGXF,EAAoB,SAAUhG,UAAYA,EAAIP,GAAKlG,EAAEyG,GAAK,OACtDqG,EAAkB3M,EAAEiM,OAAOM,EAAU,CAAE7M,IAAK,EAAGgN,QAAS,WAE5DJ,EAAoB,SAAUhG,UAAYA,EAAIP,IAAOA,EAAI,GAAKO,EAAI,EAAKzG,EAAEyG,GAAK,EAAIzG,EAAEyG,GAAK,IAGlF,CACHsG,MAAO,EAHW5M,EAAEiM,OAAOM,EAAU,CAAE7M,IAAK,EAAGgN,QAAS,IAG7BhN,IAC3BmN,KAAM,EAAIF,EAAgBjN,MAYlC6F,EAAWnH,UAAU0O,0BAA4B,eACzC/B,EAAO,IAAIxF,EAEfwF,EAAKlE,MAAQ/I,KAAK+I,MAAMmE,QAAQ+B,cAE5BC,EAAMjC,EAAKqB,mCAEfY,EAAIJ,KAAO,EAAII,EAAIJ,KACnBI,EAAIH,KAAO,EAAIG,EAAIH,KAEZG,GAWXzH,EAAWnH,UAAUmN,OAAS,eACtB0B,EAAMnP,KAAKsO,4BACXd,EAAK,CAAEG,KAAMwB,EAAIL,KAAMlB,KAAMuB,EAAIJ,aAEpB,IAAbI,EAAIL,MAA2B,IAAbK,EAAIJ,KACfvB,GAGM,IAAb2B,EAAIL,KACJtB,EAAGG,KAAO3N,KAAKgP,4BAA4BD,KAEzB,IAAbI,EAAIJ,OACTvB,EAAGI,KAAO5N,KAAKgP,4BAA4BF,MAG3CtB,EAAGG,KAAOH,EAAGI,OAEbJ,EAAGG,KAAOH,EAAGI,KAAO,GAGjBJ,IAuBX/F,EAAWuG,wBAA0B,SAAUoB,EAAIhN,EAAG2L,EAAIsB,EAAgB1N,EAAKC,OACvEhC,EAAiB0P,EAA+BC,EAAcC,EAC3DC,EAASC,EADTC,EAAW,EAAQC,EAAuB,EAGjDhQ,EAAIwP,MAGAS,EAAwB3O,KAAK0L,IAAI,IADtB,IAEXkD,EAA4B,iBAARnO,GAAmC,iBAARC,KAE/CkO,EAAW,IACPnO,EAAMC,QACA,IAAIwG,MAAM,wDAGpBqH,EAAUrN,EAAET,GACZ+N,EAAUtN,EAAER,GAER+I,EAAK8E,IAAa9E,EAAK+E,SACjB,IAAItH,MAAM,wEAUpBI,EANAuH,EAAqB,kBAEb7O,KAAKC,IAAIoO,IAAiBM,EAAwB3O,KAAKC,IAAIvB,IAC3DgQ,GAAyBhQ,EAAI2P,EAAgB3P,OAKpD4I,EAAI,EAAGA,EAAI6G,EAAgB7G,IAAK,IAGtB,IAFX8G,EAAMvB,EAAGnO,IAEK,IACM,GAAZ+P,QAEM,IAAIvH,MAAM,sCAIhBkH,EAAMK,KAMdA,EAAWL,EACXzP,EAAIuC,EAAExC,GACN2P,EAAe1P,EAAIyP,EACnBE,EAAQ5P,EAAI2P,EAERQ,aAIAD,EAAW,IACPnF,EAAK9K,IAAM8K,EAAK+E,GAChB9N,EAAMhC,EACN8P,EAAU7P,MAET,CAAA,GAAI8K,EAAK9K,IAAM8K,EAAK8E,GAIpB,CACD7P,EAAI4P,QAJJ7N,EAAM/B,EACN6P,EAAU5P,KAOT2P,EAAQ7N,GAAS6N,EAAQ5N,EAAM,IAC5B+I,EAAK8E,IAAY9E,EAAK+E,aAMtBjO,EAAKiO,EAAUD,EACfjO,EAAKI,EAAMD,KAGX4N,EADM,GAAN9N,EACe7B,GAAK+B,EAAW,GAALH,GAErBN,KAAKC,IAAIM,EAAKP,KAAKS,IAAI8N,EAASC,IARvB,GASC9P,GAAK+B,EAAMH,GAAM,IAAON,KAAKC,IAAIsO,GAAWvO,KAAKC,IAAIuO,IAR9C,IAAA,OAWP9P,GAAK+B,EAAM8N,EAAUhO,EAAKD,GAE7CgO,EAAQ5P,EAAI2P,EAERQ,WAMZH,EAAuBhQ,EAAI4P,EAC3B5P,EAAI4P,SAGD5P,GAIP0C,UAAiBmF,yBCh9BbA,EAAaD,EAiBrB,SAASwI,SACAtI,KAAMC,WAZfqI,EAAeC,QAAU,EAGzBD,EAAe1P,UAAwB,IAAImH,EAC3CuI,EAAe1P,UAAUE,YAAcwP,EACvCA,EAAeE,WAAwBzI,EAAWnH,UAiBlD0P,EAAe1P,UAAU6I,KAAO,SAASvJ,OAEjCwJ,EAAS4G,EAAeE,WAAW/G,KAAKgH,KAAKnQ,KAAMJ,MAKlDsB,KAAKC,IAAIiI,GANE,OAMoBA,EAAS,GACxCA,EAAS,EACV,MAAM,IAAIhB,MAAM,0EAEblH,KAAKQ,KAAK0H,IAGrB4G,EAAe1P,UAAU+B,SAAW,iBAGzB,QAFM2N,EAAeE,WAAW7N,SAAS8N,KAAKnQ,MAE3B,KAI1BsC,UAAiB0N,ICxDAxI,GCerB,SAAS4I,EAAUC,UACRA,MAAAA,EASX,SAASC,EAAaC,OACZC,EAAOD,EAAOrD,eAEpBsD,EAAKxH,KAAKuH,EAAO,IAEVC,EASX,SAASC,EAAaC,QACbhJ,KAAKgJ,GC3Bd,SAASC,EAAiBC,EAAMC,QACvBnJ,KAAKkJ,EAAMC,GDoCpBJ,EAAanQ,UAAUoH,KAAO,SAASgJ,QAC9BA,OAASA,OACTH,OAAS,IASlBE,EAAanQ,UAAUwQ,YAAc,SAASC,QACrCR,OAAOvH,KAAK+H,IASrBN,EAAanQ,UAAU0Q,aAAe,SAAST,QACtCA,OAASvQ,KAAKuQ,OAAOtC,OAAOsC,IAarCE,EAAaQ,UAAY,SAASC,EAAQC,OAClC/H,KAECgH,EAAUc,IAAYd,EAAUe,GA4BjC/H,EAAS,IAAIqH,EAAa,2BA3BN,SAAhBS,EAAON,KACPxH,EAASqH,EAAaW,mBAAmBF,EAAQC,QAEhD,GAAoB,SAAhBA,EAAOP,KACZxH,EAASqH,EAAaW,mBAAmBD,EAAQD,OAEhD,KACGG,EACAR,KAEAK,EAAON,KAAOO,EAAOP,MACrBS,EAAS,YAAcH,EAAON,KAAOO,EAAOP,KAC5CC,EAAOK,EAAOL,KAAK5C,OAAOkD,EAAON,QAGjCQ,EAAS,YAAcF,EAAOP,KAAOM,EAAON,KAC5CC,EAAOM,EAAON,KAAK5C,OAAOiD,EAAOL,SAG/BQ,KAAUZ,SACN,IAAIrI,MAAM,+BAAiCiJ,GAGrDjI,EAASqH,EAAaY,GAAQC,MAAM,KAAMT,UAO3CzH,GAWXqH,EAAaW,mBAAqB,SAASG,EAAMC,OACvCpI,EAAS,IAAIqH,EAAa,sDAEVc,EAAKV,oDAAM,KAAtBY,UACDC,EAAQjB,EAAaQ,UAAUQ,EAASD,GAE9CpI,EAAO4H,aAAaU,EAAMnB,kGAG1BnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAeXqH,EAAakB,wBAA0B,SAAS1K,EAAIE,EAAIyK,EAAIC,EAAIC,EAAIC,OAC5DhQ,EAAGG,EACDkH,EAAS,IAAIqH,EAAa,mBAEhC1O,EAAIoF,EAAGvG,UAAU,OACXoR,EAAM/K,EAAGxG,IAAIsB,EAAEtB,IAAImR,IAEzB7P,EAAIkF,EAAGrG,UAAU,GACjBsB,EAAIiF,EAAGvG,SAAS,OACVqR,EAAMlQ,EAAEtB,IAAIyB,GAEZgQ,EAAM,IAAIvS,EAAQsH,EAAGrH,EAAGqH,EAAGpH,GAEjCkC,EAAI+P,EAAGlR,UAAU,OACXuR,EAAMN,EAAGpR,IAAIsB,EAAEtB,IAAIsR,IAEzBhQ,EAAI8P,EAAGjR,UAAU,GACjBsB,EAAI4P,EAAGlR,SAAS,OACVwR,EAAMrQ,EAAEtB,IAAIyB,GAEZmQ,EAAM,IAAI1S,EAAQkS,EAAGjS,EAAGiS,EAAGhS,GAGjCkC,EAAIiQ,EAAIpS,EAAEqS,EAAIpS,EAAIoS,EAAIrS,EAAEoS,EAAInS,EAC5BqC,EAAIiQ,EAAIvS,EAAEqS,EAAIpS,EAAIoS,EAAIrS,EAAEuS,EAAItS,MACtBmC,EAAIoQ,EAAIxS,EAAEqS,EAAIpS,EAAIoS,EAAIrS,EAAEwS,EAAIvS,EAC5BsC,EAAI8P,EAAIrS,GAAGsS,EAAIrS,EAAIwS,EAAIxS,GAAKoS,EAAIpS,IAAIqS,EAAItS,EAAIyS,EAAIzS,GAChDqC,EAAIkQ,EAAIvS,EAAEoS,EAAInS,EAAImS,EAAIpS,EAAEuS,EAAItS,EAC5BuC,EAAIgQ,EAAIxS,EAAEoS,EAAInS,EAAImS,EAAIpS,EAAEwS,EAAIvS,EAC5ByS,EAAIN,EAAIpS,GAAGsS,EAAIrS,EAAIwS,EAAIxS,GAAKmS,EAAInS,IAAIqS,EAAItS,EAAIyS,EAAIzS,GAWhDqM,EARO,IAAIxE,GACZxF,EAAEA,GACF,EAAEA,EAAEG,EACLL,EAAEG,EAAIE,EAAEA,EAAI,EAAEH,EAAEqQ,EAChBvQ,EAAEC,EAAI,EAAEI,EAAEkQ,EACVvQ,EAAEI,EAAImQ,EAAEA,GAGO5G,8CAEHO,iDAAO,KAAZtH,aACH,GAAKA,GAAKA,GAAK,EAAG,KACZ4N,EAAK,IAAI9K,EACXuK,EAAIpS,EACJqS,EAAIrS,EACJsS,EAAItS,EAAIyS,EAAIzS,EAAI+E,EAAEyN,EAAIxS,EAAI+E,EAAEA,EAAEwN,EAAIvS,GAEtC2S,EAAG1I,eACG2I,EAASD,EAAG7G,WACZ+G,EAAK,IAAIhL,EACXuK,EAAInS,EACJoS,EAAIpS,EACJqS,EAAIrS,EAAIwS,EAAIxS,EAAI8E,EAAEyN,EAAIvS,EAAI8E,EAAEA,EAAEwN,EAAItS,GAEtC4S,EAAG5I,eACG6I,EAASD,EAAG/G,cAEd8G,EAAO7P,OAAS,GAAK+P,EAAO/P,OAAS,EAAG,4BAGxCgQ,EACA,YAAoBH,iDAAQ,KAAjBI,aACH,GAAKA,GAASA,GAAS,MAClB,IAAIC,EAAI,EAAGA,EAAIH,EAAO/P,OAAQkQ,OAC3B3R,KAAKC,IAAIyR,EAAQF,EAAOG,IANtB,KAMuC,CACzCzJ,EAAOmH,OAAOvH,KAAKmJ,EAAIvR,SAAS+D,EAAEA,GAAGlE,IAAI2R,EAAIxR,SAAS+D,GAAGlE,IAAI4R,WACvDM,mLAS9BvJ,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAgBXqH,EAAaqC,wBAA0B,SAAS7L,EAAIE,EAAIyK,EAAIC,EAAIC,EAAIC,EAAIgB,OAChEhR,EAAGG,EAAGF,EAAGG,EACPiH,EAAS,IAAIqH,EAAa,mBAEhC1O,EAAIoF,EAAGvG,UAAU,OACXoR,EAAM/K,EAAGxG,IAAIsB,EAAEtB,IAAImR,IAEzB7P,EAAIkF,EAAGrG,UAAU,GACjBsB,EAAIiF,EAAGvG,SAAS,OACVqR,EAAMlQ,EAAEtB,IAAIyB,GAEZgQ,EAAM,IAAIvS,EAAQsH,EAAGrH,EAAGqH,EAAGpH,GAEjCkC,EAAI8P,EAAGjR,UAAU,GACjBsB,EAAI4P,EAAGlR,SAAS,GAChBoB,EAAI+P,EAAGnR,UAAU,GACjBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,EAAEvB,IAAIsS,SAChBC,EAAM,IAAIzQ,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAEhCkC,EAAI8P,EAAGjR,SAAS,GAChBsB,EAAI4P,EAAGlR,UAAU,GACjBoB,EAAI+P,EAAGnR,SAAS,GAChBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,QACVmQ,EAAM,IAAI5P,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAEhCkC,EAAI8P,EAAGjR,UAAU,GACjBsB,EAAI4P,EAAGlR,SAAS,GAChBoB,EAAID,EAAEtB,IAAIyB,OACJkQ,EAAM,IAAI7P,EAASP,EAAEpC,EAAGoC,EAAEnC,GAE1BwS,EAAM,IAAI9P,EAASsP,EAAGjS,EAAGiS,EAAGhS,GAE5BoT,EAAQf,EAAItS,EAAEsS,EAAItS,EAClBsT,EAAQhB,EAAIrS,EAAEqS,EAAIrS,EAClBsT,EAAQlB,EAAIrS,EAAEqS,EAAIrS,EAClBwT,EAAQnB,EAAIpS,EAAEoS,EAAIpS,EAClBwT,EAAQrB,EAAIpS,EAAEoS,EAAIpS,EAClB0T,EAAQtB,EAAInS,EAAEmS,EAAInS,EAClB0T,EAAQlB,EAAIzS,EAAEyS,EAAIzS,EAClB4T,EAAQnB,EAAIxS,EAAEwS,EAAIxS,EAClB4T,EAAQrB,EAAIxS,EAAEwS,EAAIxS,EAClB8T,EAAQtB,EAAIvS,EAAEuS,EAAIvS,EAClB8T,EAAQxB,EAAIvS,EAAEuS,EAAIvS,EAClBgU,EAAQzB,EAAItS,EAAEsS,EAAItS,EAClBgU,EAAQb,EAAIpT,EAAEoT,EAAIpT,EAClBkU,EAAQd,EAAInT,EAAEmT,EAAInT,EA6BlBoM,EA3BO,IAAIxE,GACZ,EAAEuK,EAAIpS,EAAEoS,EAAInS,EAAEmT,EAAIpT,EAAEoT,EAAInT,EAAIwT,EAAMS,EAAQR,EAAMO,GAChD,EAAE7B,EAAIpS,EAAEoS,EAAInS,EAAEsS,EAAIvS,EAAEoT,EAAInT,EAAI,EAAEmS,EAAIpS,EAAEoS,EAAInS,EAAEsS,EAAItS,EAAEmT,EAAIpT,EAAI,EAAE0T,EAAMnB,EAAIvS,EAAEoT,EAAIpT,EACvE,EAAEyT,EAAMlB,EAAItS,EAAEmT,EAAInT,GACrB,EAAEmS,EAAIpS,EAAEwS,EAAIxS,EAAEoS,EAAInS,EAAEmT,EAAInT,EAAI,EAAEmS,EAAIpS,EAAEoS,EAAInS,EAAEuS,EAAIvS,EAAEmT,EAAIpT,EAAI,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAEsS,EAAIvS,EAAEuS,EAAItS,EAC7E,EAAEuS,EAAIxS,EAAE0T,EAAMN,EAAIpT,EAAI0T,EAAMK,EAAQN,GAAO,EAAEjB,EAAIvS,EAAEmT,EAAInT,EAAI+T,GAC/D,EAAE1B,EAAItS,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAEmT,EAAInT,EAAI,EAAEqS,EAAIrS,EAAEmS,EAAIpS,EAAEoS,EAAInS,EAAEmT,EAAIpT,EAAIqS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAIpS,EAAEoT,EAAInT,EAC1EoS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAInS,EAAEmT,EAAIpT,EAAI,EAAEyS,EAAIzS,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAEmT,EAAInT,EAAI,EAAEmS,EAAIpS,EAAEyS,EAAIxS,EAAEmS,EAAInS,EAAEmT,EAAIpT,EAC9E,EAAEoS,EAAIpS,EAAEwS,EAAIxS,EAAEoS,EAAInS,EAAEsS,EAAItS,EAAI,EAAEmS,EAAIpS,EAAEoS,EAAInS,EAAEuS,EAAIvS,EAAEsS,EAAIvS,EAAI,EAAEsS,EAAItS,EAAE0T,EAAMN,EAAIpT,EAC1E,EAAEsS,EAAIrS,EAAEwT,EAAML,EAAInT,EAAI,EAAEwS,EAAIzS,EAAE0T,EAAMN,EAAIpT,EAAI,EAAEwS,EAAIxS,EAAE0T,EAAMnB,EAAIvS,EAC9DwT,EAAMpB,EAAIpS,EAAEoT,EAAIpT,EAAIuT,EAAMnB,EAAInS,EAAEmT,EAAInT,EAAIwT,GAAO,EAAEhB,EAAIxS,EAAEmT,EAAInT,EAAI,EAAEuS,EAAIvS,EAAEsS,EAAItS,GAC/E,EAAEqS,EAAItS,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAEsS,EAAItS,EAAI,EAAEqS,EAAIrS,EAAEmS,EAAIpS,EAAEoS,EAAInS,EAAEsS,EAAIvS,EAAIqS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAIpS,EAAEuS,EAAItS,EAC1EoS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAInS,EAAEsS,EAAIvS,EAAI,EAAEyS,EAAIzS,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAEsS,EAAItS,EAAI,EAAEmS,EAAIpS,EAAEyS,EAAIxS,EAAEmS,EAAInS,EAAEsS,EAAIvS,EAC9E,EAAEoS,EAAIpS,EAAEwS,EAAIxS,EAAEoS,EAAInS,EAAEuS,EAAIvS,EAAI,EAAEqS,EAAItS,EAAE0T,EAAMnB,EAAIvS,EAAI,EAAEsS,EAAIrS,EAAEwT,EAAMlB,EAAItS,EACpE,EAAEwS,EAAIzS,EAAE0T,EAAMnB,EAAIvS,EAAIwT,EAAMpB,EAAIpS,EAAEuS,EAAIvS,EAAIuT,EAAMnB,EAAInS,EAAEsS,EAAItS,EAAI4T,EAAMH,EACpED,GAAO,EAAEhB,EAAIxS,EAAEsS,EAAItS,EAAI6T,GAC3B,EAAExB,EAAItS,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAEuS,EAAIvS,EAAI,EAAEqS,EAAIrS,EAAEmS,EAAIpS,EAAEwS,EAAIxS,EAAEoS,EAAInS,EAAIoS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAIpS,EAAEwS,EAAIvS,EAC1EoS,EAAIrS,EAAEqS,EAAIpS,EAAEuS,EAAIxS,EAAEoS,EAAInS,EAAI,EAAEwS,EAAIzS,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAEuS,EAAIvS,EAAI,EAAEmS,EAAIpS,EAAEyS,EAAIxS,EAAEuS,EAAIxS,EAAEoS,EAAInS,EAC9E,EAAEqS,EAAItS,EAAEwS,EAAIxS,EAAE0T,EAAQ,EAAEpB,EAAIrS,EAAEwT,EAAMjB,EAAIvS,EAAI,EAAEwS,EAAIzS,EAAEwS,EAAIxS,EAAE0T,EAC1DF,EAAMpB,EAAIpS,EAAEwS,EAAIxS,EAAIuT,EAAMnB,EAAInS,EAAEuS,EAAIvS,EAAI,EAAEwT,EAAMhB,EAAIxS,EAAEuS,EAAIvS,GAC7D,EAAEqS,EAAItS,EAAEsS,EAAIrS,EAAEmS,EAAIpS,EAAEoS,EAAInS,EAAIqS,EAAItS,EAAEqS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAInS,EAAIqS,EAAIrS,EAAEoS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAIpS,EACzE,EAAEsS,EAAItS,EAAEoS,EAAIpS,EAAEyS,EAAIxS,EAAEmS,EAAInS,EAAI,EAAEqS,EAAIrS,EAAEwS,EAAIzS,EAAEoS,EAAIpS,EAAEoS,EAAInS,EAAIoS,EAAIrS,EAAEyS,EAAIzS,EAAEqS,EAAIpS,EAAEmS,EAAInS,EAC9EoS,EAAIrS,EAAEqS,EAAIpS,EAAEmS,EAAIpS,EAAEyS,EAAIxS,EAAI,EAAEwS,EAAIzS,EAAEoS,EAAIpS,EAAEyS,EAAIxS,EAAEmS,EAAInS,EAAI,EAAEqS,EAAItS,EAAEyS,EAAIzS,EAAE0T,EACpEpB,EAAItS,EAAEwT,EAAMpB,EAAIpS,EAAIsS,EAAIrS,EAAEsT,EAAMnB,EAAInS,EAAI,EAAEqS,EAAIrS,EAAEwT,EAAMhB,EAAIxS,EAC1DwS,EAAIzS,EAAEwT,EAAMpB,EAAIpS,EAAIuT,EAAMd,EAAIxS,EAAEmS,EAAInS,EAAIoT,EAAMK,EAAQJ,EAAMG,EAC5DE,EAAMD,EAAQD,EAAMG,GAETzH,mBAAmB,EAAG,sCAEzBE,iDAAO,KAAZtH,UACD6N,EAAS,IAAI/K,EACfuK,EAAIpS,EACJqS,EAAIrS,EACJsS,EAAItS,EAAIyS,EAAIzS,EAAI+E,EAAEyN,EAAIxS,EAAI+E,EAAEA,EAAEwN,EAAIvS,EAAI+E,EAAEA,EAAEA,EAAEqO,EAAIpT,GAClD8L,WACIgH,EAAS,IAAIjL,EACfuK,EAAInS,EACJoS,EAAIpS,EACJqS,EAAIrS,EAAIwS,EAAIxS,EAAI8E,EAAEyN,EAAIvS,EAAI8E,EAAEA,EAAEwN,EAAItS,EAAI8E,EAAEA,EAAEA,EAAEqO,EAAInT,GAClD6L,cAEE8G,EAAO7P,OAAS,GAAK+P,EAAO/P,OAAS,EAAG,4BAGxCgQ,EACA,YAAoBH,iDAAQ,KAAjBI,aACH,GAAKA,GAASA,GAAS,MAClB,IAAIC,EAAI,EAAGA,EAAIH,EAAO/P,OAAQkQ,OAC3B3R,KAAKC,IAAIyR,EAAQF,EAAOG,IANtB,KAMuC,CACzCzJ,EAAOmH,OAAOvH,KACVgK,EAAIpS,SAAS+D,EAAEA,EAAEA,GAAGlE,IAAI0R,EAAIvR,SAAS+D,EAAEA,GAAGlE,IAAI2R,EAAIxR,SAAS+D,GAAGlE,IAAI4R,YAEhEM,kLAQ1BvJ,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAcXqH,EAAasD,uBAAyB,SAAStR,EAAIC,EAAIsR,EAAIhS,EAAGiS,UACnDxD,EAAayD,wBAAwBzR,EAAIC,EAAIsR,EAAIhS,EAAGiS,EAAGA,IAelExD,EAAayD,wBAA0B,SAASzR,EAAIC,EAAIsR,EAAIG,EAAIC,EAAIC,OAC5DtS,EAEEqH,EAAS,IAAIqH,EAAa,mBAEhC1O,EAAIW,EAAG9B,UAAU,OACXyL,EAAK5J,EAAGhC,IAAIsB,EAAEtB,IAAIuT,IAExBjS,EAAIU,EAAG7B,UAAU,OACXsB,EAAIQ,EAAG9B,SAAS,GAChB0L,EAAKvK,EAAEtB,IAAIyB,GAEXoS,EAAK,IAAI3U,EAAQ8C,EAAG7C,EAAG6C,EAAG5C,GAE1B0U,EAAOH,EAAGA,EACVI,EAAOH,EAAGA,EACVpI,EAAQ,IAAIxE,EACd+M,EAAKnI,EAAGzM,EAAEyM,EAAGzM,EAAI2U,EAAKlI,EAAGxM,EAAEwM,EAAGxM,EAC9B,GAAG2U,EAAKnI,EAAGzM,EAAE0M,EAAG1M,EAAI2U,EAAKlI,EAAGxM,EAAEyM,EAAGzM,GACjC2U,GAAM,EAAEnI,EAAGzM,EAAE0U,EAAG1U,EAAI0M,EAAG1M,EAAE0M,EAAG1M,GAAK2U,GAAM,EAAElI,EAAGxM,EAAEyU,EAAGzU,EAAEyM,EAAGzM,EAAEyM,EAAGzM,GACvD,GAAG2U,EAAKL,EAAGvU,EAAEyM,EAAGzM,EAAI2U,EAAKJ,EAAGtU,EAAEwM,EAAGxM,GACrC,GAAG2U,EAAKlI,EAAG1M,GAAG0U,EAAG1U,EAAEuU,EAAGvU,GAAK2U,EAAKjI,EAAGzM,GAAGyU,EAAGzU,EAAEsU,EAAGtU,IAC9C2U,GAAMF,EAAG1U,EAAE0U,EAAG1U,EAAEuU,EAAGvU,EAAEuU,EAAGvU,GAAK2U,GAAMD,EAAGzU,EAAEyU,EAAGzU,EAAIsU,EAAGtU,EAAEsU,EAAGtU,GACnD,GAAG2U,EAAKL,EAAGvU,EAAE0U,EAAG1U,EAAI2U,EAAKJ,EAAGtU,EAAEyU,EAAGzU,GAAK0U,EAAKC,GACjD9I,8CAEcO,iDAAO,KAAZ5K,UACH,GAAKA,GAAKA,GAAK,GACf+H,EAAOmH,OAAOvH,KAAKqD,EAAGzL,SAASS,EAAEA,GAAGZ,IAAI6L,EAAG1L,SAASS,GAAGZ,IAAI6T,+FAI/DlL,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAcXqH,EAAagE,qBAAuB,SAAShS,EAAIC,EAAIsR,EAAI/M,EAAIE,OACrDpF,EAIEJ,EAAMsF,EAAGtF,IAAIwF,GACbvF,EAAMqF,EAAGrF,IAAIuF,GACbiC,EAAS,IAAIqH,EAAa,mBAEhC1O,EAAIW,EAAG9B,UAAU,OACXyL,EAAK5J,EAAGhC,IAAIsB,EAAEtB,IAAIuT,IAExBjS,EAAIU,EAAG7B,UAAU,OACXsB,EAAIQ,EAAG9B,SAAS,GAChB0L,EAAKvK,EAAEtB,IAAIyB,GAEXoS,EAAK,IAAI3U,EAAQ8C,EAAG7C,EAAG6C,EAAG5C,GAI1BoI,EAAI,IAAI1F,EAAS0E,EAAGpH,EAAIsH,EAAGtH,EAAGsH,EAAGvH,EAAIqH,EAAGrH,GAGxC8U,EAAKzN,EAAGrH,EAAEuH,EAAGtH,EAAIsH,EAAGvH,EAAEqH,EAAGpH,EAIzBoM,EAAQ,IAAIxE,EACdQ,EAAEpF,IAAIwJ,GACNpE,EAAEpF,IAAIyJ,GACNrE,EAAEpF,IAAIyR,GAAMI,GACdhJ,8CAKcO,iDAAO,KAAZ5K,aACH,GAAKA,GAAKA,GAAK,EAAG,KAGZsT,EAAKlS,EAAGrB,KAAKsB,EAAIrB,GACjBuT,EAAKlS,EAAGtB,KAAK4S,EAAI3S,GAEjBwT,EAAKF,EAAGvT,KAAKwT,EAAIvT,GAKnB4F,EAAGrH,GAAKuH,EAAGvH,EACP+B,EAAI9B,GAAKgV,EAAGhV,GAAKgV,EAAGhV,GAAK+B,EAAI/B,IAC7BuJ,EAAOsH,OAAS,eAChBtH,EAAO0H,YAAY+D,IAGlB5N,EAAGpH,GAAKsH,EAAGtH,EACZ8B,EAAI/B,GAAKiV,EAAGjV,GAAKiV,EAAGjV,GAAKgC,EAAIhC,IAC7BwJ,EAAOsH,OAAS,eAChBtH,EAAO0H,YAAY+D,IAGlBlT,EAAI/B,GAAKiV,EAAGjV,GAAKiV,EAAGjV,GAAKgC,EAAIhC,GAAK+B,EAAI9B,GAAKgV,EAAGhV,GAAKgV,EAAGhV,GAAK+B,EAAI/B,IACpEuJ,EAAOsH,OAAS,eAChBtH,EAAO0H,YAAY+D,+FAKxBzL,GAaXqH,EAAaqE,wBAA0B,SAASrS,EAAIC,EAAIsR,EAAIzD,UACjDE,EAAasE,yBAAyBtS,EAAIC,EAAIsR,EAAI1D,EAAaC,KAa1EE,EAAasE,yBAA2B,SAAStS,EAAIC,EAAIsR,EAAIzD,WACnDnH,EAAS,IAAIqH,EAAa,mBACjBuE,EAAOzE,EAAf5N,OAEE6F,EAAI,EAAGA,EAAIwM,EAAM,EAAGxM,IAAK,KACxBvB,EAAKsJ,EAAO/H,GACZrB,EAAKoJ,EAAO/H,EAAI,GAChBkJ,EAAQjB,EAAagE,qBAAqBhS,EAAIC,EAAIsR,EAAI/M,EAAIE,GAEhEiC,EAAO4H,aAAaU,EAAMnB,eAG1BnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAcXqH,EAAawE,0BAA4B,SAASxS,EAAIC,EAAIsR,EAAIkB,EAAIC,OACxDxT,EAAMuT,EAAGvT,IAAIwT,GACbvT,EAAMsT,EAAGtT,IAAIuT,GACbC,EAAW,IAAIzV,EAAQiC,EAAIhC,EAAG+B,EAAI9B,GAClCwV,EAAa,IAAI1V,EAAQgC,EAAI/B,EAAGgC,EAAI/B,GAEpCyV,EAAS7E,EAAagE,qBAAqBhS,EAAIC,EAAIsR,EAAIrS,EAAKyT,GAC5DG,EAAS9E,EAAagE,qBAAqBhS,EAAIC,EAAIsR,EAAIoB,EAAUxT,GACjE4T,EAAS/E,EAAagE,qBAAqBhS,EAAIC,EAAIsR,EAAIpS,EAAKyT,GAC5DI,EAAShF,EAAagE,qBAAqBhS,EAAIC,EAAIsR,EAAIqB,EAAY1T,GAEnEyH,EAAS,IAAIqH,EAAa,0BAEhCrH,EAAO4H,aAAasE,EAAO/E,QAC3BnH,EAAO4H,aAAauE,EAAOhF,QAC3BnH,EAAO4H,aAAawE,EAAOjF,QAC3BnH,EAAO4H,aAAayE,EAAOlF,QAEvBnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAiBXqH,EAAaiF,wBAA0B,SAASzO,EAAIE,EAAIyK,EAAI+D,EAAI9D,EAAIC,EAAIC,EAAIgB,OACpEhR,EAAGG,EAAGF,EAAGG,EAGPiH,EAAS,IAAIqH,EAAa,mBAGhC1O,EAAIkF,EAAGrG,UAAU,GACjBsB,EAAIiF,EAAGvG,SAAS,GAChBoB,EAAI4P,EAAGhR,UAAU,GACjBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,EAAEvB,IAAIkV,SAChBC,EAAM,IAAIrT,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAEhCkC,EAAIkF,EAAGrG,SAAS,GAChBsB,EAAIiF,EAAGvG,UAAU,GACjBoB,EAAI4P,EAAGhR,SAAS,GAChBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,QACVgQ,EAAM,IAAIzP,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAEhCkC,EAAIkF,EAAGrG,UAAU,GACjBsB,EAAIiF,EAAGvG,SAAS,GAChBoB,EAAID,EAAEtB,IAAIyB,OACJ+P,EAAM,IAAI1P,EAASP,EAAEpC,EAAGoC,EAAEnC,GAE1BqS,EAAM,IAAI3P,EAAS0E,EAAGrH,EAAGqH,EAAGpH,GAElCkC,EAAI8P,EAAGjR,UAAU,GACjBsB,EAAI4P,EAAGlR,SAAS,GAChBoB,EAAI+P,EAAGnR,UAAU,GACjBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,EAAEvB,IAAIsS,SAChBC,EAAM,IAAIzQ,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAEhCkC,EAAI8P,EAAGjR,SAAS,GAChBsB,EAAI4P,EAAGlR,UAAU,GACjBoB,EAAI+P,EAAGnR,SAAS,GAChBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,QACVmQ,EAAM,IAAI5P,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAEhCkC,EAAI8P,EAAGjR,UAAU,GACjBsB,EAAI4P,EAAGlR,SAAS,GAChBoB,EAAID,EAAEtB,IAAIyB,OACJkQ,EAAM,IAAI7P,EAASP,EAAEpC,EAAGoC,EAAEnC,GAE1BwS,EAAM,IAAI9P,EAASsP,EAAGjS,EAAGiS,EAAGhS,GAGlCkC,EAAI6T,EAAIhW,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIgW,EAAI/V,EAChCqC,EAAI0T,EAAIhW,EAAIqS,EAAIpS,EAAIoS,EAAIrS,EAAIgW,EAAI/V,MAC1ByU,EAAKsB,EAAIhW,EAAIsS,EAAIrS,EAAIqS,EAAItS,EAAIgW,EAAI/V,EAAIwS,EAAIzS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIyS,EAAIxS,EACjEyM,EAAK8F,EAAIxS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIwS,EAAIvS,EACjCwM,EAAK8F,EAAIvS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIuS,EAAItS,EACjCuM,EAAK4G,EAAIpT,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIoT,EAAInT,EACvCsC,EAAIyT,EAAIhW,EAAIqS,EAAIpS,EAAIoS,EAAIrS,EAAIgW,EAAI/V,MAC1BgW,EAAKD,EAAIhW,EAAIsS,EAAIrS,EAAImS,EAAIpS,EAAIqS,EAAIpS,EAAIoS,EAAIrS,EAAIoS,EAAInS,EAAIqS,EAAItS,EAAIgW,EAAI/V,EAAIwS,EAAIzS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIyS,EAAIxS,EACjGiW,EAAK1D,EAAIxS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIwS,EAAIvS,EACjCkW,EAAK5D,EAAIvS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIuS,EAAItS,EACjCmW,EAAKhD,EAAIpT,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIoT,EAAInT,EACjCoW,EAAKjE,EAAIpS,EAAIsS,EAAIrS,EAAIqS,EAAItS,EAAIoS,EAAInS,EAAIwS,EAAIzS,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIyS,EAAIxS,EACjEqW,EAAK9D,EAAIxS,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIwS,EAAIvS,EACjCsW,EAAKhE,EAAIvS,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIuS,EAAItS,EACjCuW,EAAKpD,EAAIpT,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIoT,EAAInT,EACjCwW,EAAKT,EAAIhW,EAAIsS,EAAIrS,EAAIqS,EAAItS,EAAIgW,EAAI/V,EAAIwS,EAAIzS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIyS,EAAIxS,EACjEyW,EAAKlE,EAAIxS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIwS,EAAIvS,EACjC0W,EAAKpE,EAAIvS,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIuS,EAAItS,EACjC2W,EAAKxD,EAAIpT,EAAIgW,EAAI/V,EAAI+V,EAAIhW,EAAIoT,EAAInT,EACjC4W,EAAKzE,EAAIpS,EAAIsS,EAAIrS,EAAIqS,EAAItS,EAAIoS,EAAInS,EAAIwS,EAAIzS,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIyS,EAAIxS,EACjE6W,EAAKtE,EAAIxS,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIwS,EAAIvS,EACjC8W,EAAKxE,EAAIvS,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIuS,EAAItS,EACjC+W,EAAK5D,EAAIpT,EAAIoS,EAAInS,EAAImS,EAAIpS,EAAIoT,EAAInT,EACjCgX,EAAK5E,EAAIrS,EAAIsS,EAAIrS,EAAIqS,EAAItS,EAAIqS,EAAIpS,EAAIwS,EAAIzS,EAAIqS,EAAIpS,EAAIoS,EAAIrS,EAAIyS,EAAIxS,EACjEiX,EAAK1E,EAAIxS,EAAIqS,EAAIpS,EAAIoS,EAAIrS,EAAIwS,EAAIvS,EACjCkX,EAAK5E,EAAIvS,EAAIqS,EAAIpS,EAAIoS,EAAIrS,EAAIuS,EAAItS,EACjCmX,EAAKhE,EAAIpT,EAAIqS,EAAIpS,EAAIoS,EAAIrS,EAAIoT,EAAInT,EAGjCoN,EAAO,IAAIxF,GACZ2E,EAAK4J,EAAKQ,GACVpK,EAAK4J,EAAKO,EAAKnK,EAAK2J,EAAKS,EAAKnK,EAAK2J,EAAKQ,GACxCpK,EAAK4J,EAAKM,EAAKlK,EAAK2J,EAAKQ,EAAKlK,EAAK2J,EAAKO,EAAKnK,EAAK0J,EAAKU,EAAKnK,EAAK0J,EAAKS,EAAKlK,EAAK0J,EAAKQ,GACrFpK,EAAK4J,EAAKK,EAAKjK,EAAK2J,EAAKO,EAAKjK,EAAK2J,EAAKM,EAAKlK,EAAK0J,EAAKS,EAAKlK,EAAK0J,EAAKQ,EAAKjK,EAAK0J,EAAKO,EAAKnK,EAAKyJ,EAAKW,EAAKnK,EAAKyJ,EAAKU,EAAKlK,EAAKyJ,EAAKS,EAAKlC,EAAK0B,EAAKQ,EAAKtU,EAAIkU,EAAKI,EAAKpK,EAAKjK,EAAIyU,EAAK7U,EAAIqU,EAAKQ,EAAK7U,EAAIiU,EAAKgB,GACzM5K,EAAK2J,EAAKM,EAAKhK,EAAK2J,EAAKK,EAAKjK,EAAK0J,EAAKQ,EAAKjK,EAAK0J,EAAKO,EAAKhK,EAAK0J,EAAKM,EAAKlK,EAAKyJ,EAAKU,EAAKlK,EAAKyJ,EAAKS,EAAKjK,EAAKyJ,EAAKQ,EAAKjC,EAAK0B,EAAKO,EAAKrU,EAAIkU,EAAKG,EAAKlK,EAAKwJ,EAAKW,EAAKlK,EAAKwJ,EAAKU,EAAKlC,EAAKyB,EAAKS,EAAKtU,EAAIiU,EAAKK,EAAKpK,EAAKjK,EAAIwU,EAAK5U,EAAIqU,EAAKO,EAAKtK,EAAKlK,EAAIyU,EAAK7U,EAAIoU,EAAKS,EAAK7U,EAAIiU,EAAKe,EAAKhV,EAAIgU,EAAKiB,GAC/R5K,EAAK0J,EAAKO,EAAKhK,EAAK0J,EAAKM,EAAK/J,EAAK0J,EAAKK,EAAKjK,EAAKyJ,EAAKS,EAAKjK,EAAKyJ,EAAKQ,EAAKhK,EAAKyJ,EAAKO,EAAKhC,EAAK0B,EAAKM,EAAKpU,EAAIkU,EAAKE,EAAKjK,EAAKwJ,EAAKU,EAAKjK,EAAKwJ,EAAKS,EAAKjC,EAAKyB,EAAKQ,EAAKrU,EAAIiU,EAAKI,EAAKjK,EAAKuJ,EAAKW,EAAKlC,EAAKwB,EAAKU,EAAKtU,EAAIgU,EAAKM,EAAKpK,EAAKjK,EAAIuU,EAAK3U,EAAIqU,EAAKM,EAAKrK,EAAKlK,EAAIwU,EAAK5U,EAAIoU,EAAKQ,EAAKrK,EAAKnK,EAAIyU,EAAK7U,EAAImU,EAAKU,EAAK7U,EAAIiU,EAAKc,EAAK/U,EAAIgU,EAAKgB,EAAKhV,EAAI+T,EAAKkB,GACvV5K,EAAKyJ,EAAKQ,EAAKhK,EAAKyJ,EAAKO,EAAK/J,EAAKyJ,EAAKM,EAAK/B,EAAK0B,EAAKK,EAAKnU,EAAIkU,EAAKC,EAAKhK,EAAKwJ,EAAKS,EAAKhK,EAAKwJ,EAAKQ,EAAKhC,EAAKyB,EAAKO,EAAKpU,EAAIiU,EAAKG,EAAKhK,EAAKuJ,EAAKU,EAAKjC,EAAKwB,EAAKS,EAAKrU,EAAIgU,EAAKK,EAAKjC,EAAKuB,EAAKW,EAAKtU,EAAI+T,EAAKO,EAAKpK,EAAKjK,EAAIsU,EAAK1U,EAAIqU,EAAKK,EAAKpK,EAAKlK,EAAIuU,EAAK3U,EAAIoU,EAAKO,EAAKpK,EAAKnK,EAAIwU,EAAK5U,EAAImU,EAAKS,EAAKrC,EAAKnS,EAAIyU,EAAK7U,EAAIkU,EAAKW,EAAK7U,EAAIiU,EAAKa,EAAK9U,EAAIgU,EAAKe,EAAK/U,EAAI+T,EAAKiB,EAAK7U,EAAIC,EAAI6U,EAAKjV,EAAI8T,EAAKmB,GAC9X3K,EAAKwJ,EAAKQ,EAAK/J,EAAKwJ,EAAKO,EAAK/B,EAAKyB,EAAKM,EAAKnU,EAAIiU,EAAKE,EAAK/J,EAAKuJ,EAAKS,EAAKhC,EAAKwB,EAAKQ,EAAKpU,EAAIgU,EAAKI,EAAKhC,EAAKuB,EAAKU,EAAKrU,EAAI+T,EAAKM,EAAKlK,EAAKlK,EAAIsU,EAAK1U,EAAIoU,EAAKM,EAAKnK,EAAKnK,EAAIuU,EAAK3U,EAAImU,EAAKQ,EAAKpC,EAAKnS,EAAIwU,EAAK5U,EAAIkU,EAAKU,EAAK5U,EAAIgU,EAAKc,EAAK9U,EAAI+T,EAAKgB,EAAK5U,EAAIC,EAAI4U,EAAKhV,EAAI8T,EAAKkB,GAC1QzK,EAAKuJ,EAAKQ,EAAK/B,EAAKwB,EAAKO,EAAKnU,EAAIgU,EAAKG,EAAK/B,EAAKuB,EAAKS,EAAKpU,EAAI+T,EAAKK,EAAKhK,EAAKnK,EAAIsU,EAAK1U,EAAImU,EAAKO,EAAKnC,EAAKnS,EAAIuU,EAAK3U,EAAIkU,EAAKS,EAAK3U,EAAI+T,EAAKe,EAAK3U,EAAIC,EAAI2U,EAAK/U,EAAI8T,EAAKiB,GACrKxC,EAAKuB,EAAKQ,EAAKnU,EAAI+T,EAAKI,EAAK/B,EAAKnS,EAAIsU,EAAK1U,EAAIkU,EAAKQ,EAAKvU,EAAIC,EAAI0U,EAAK9U,EAAI8T,EAAKgB,GAEpF5J,EAAKpD,eACCoC,EAAQgB,EAAKlB,mBAAmB,EAAG,uCAEzBE,kDAAO,KAAZtH,WACD4N,GAAK,IAAI9K,EACXmO,EAAIhW,EACJoS,EAAIpS,EACJqS,EAAIrS,EACJsS,EAAItS,EAAIyS,EAAIzS,EAAI+E,GAAEyN,EAAIxS,EAAI+E,GAAEA,GAAEwN,EAAIvS,EAAI+E,GAAEA,GAAEA,GAAEqO,EAAIpT,GAEpD2S,GAAG1I,eACG2I,GAASD,GAAG7G,WACZ+G,GAAK,IAAIhL,EACXmO,EAAI/V,EACJmS,EAAInS,EACJoS,EAAIpS,EACJqS,EAAIrS,EAAIwS,EAAIxS,EAAI8E,GAAEyN,EAAIvS,EAAI8E,GAAEA,GAAEwN,EAAItS,EAAI8E,GAAEA,GAAEA,GAAEqO,EAAInT,GAEpD4S,GAAG5I,eACG6I,GAASD,GAAG/G,cAEd8G,GAAO7P,OAAS,GAAK+P,GAAO/P,OAAS,EAAG,+BAGxCgQ,EACA,cAAoBH,sDAAQ,KAAjBI,eACH,GAAKA,IAASA,IAAS,MAClB,IAAIC,GAAI,EAAGA,GAAIH,GAAO/P,OAAQkQ,QAC3B3R,KAAKC,IAAIyR,GAAQF,GAAOG,KANtB,KAMuC,CACzCzJ,EAAOmH,OAAOvH,KACVgK,EAAIpS,SAAS+D,GAAEA,GAAEA,IAAGlE,IAAI0R,EAAIvR,SAAS+D,GAAEA,IAAGlE,IAAI2R,EAAIxR,SAAS+D,IAAGlE,IAAI4R,YAEhEM,2LAQ1BvJ,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAeXqH,EAAawG,uBAAyB,SAASxU,EAAIC,EAAIsR,EAAIW,EAAI3S,EAAGiS,UACvDxD,EAAayG,wBAAwBzU,EAAIC,EAAIsR,EAAIW,EAAI3S,EAAGiS,EAAGA,IAgBtExD,EAAayG,wBAA0B,SAASzU,EAAIC,EAAIsR,EAAIW,EAAIR,EAAIC,EAAIC,OAChEtS,EAAGG,EAAGF,EAAGG,EAEPiH,EAAS,IAAIqH,EAAa,mBAGhC1O,EAAIU,EAAG7B,UAAU,GACjBsB,EAAIQ,EAAG9B,SAAS,GAChBoB,EAAIgS,EAAGpT,UAAU,GACjBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,EAAEvB,IAAIkU,SAChBvI,EAAK,IAAI7J,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAE/BkC,EAAIU,EAAG7B,SAAS,GAChBsB,EAAIQ,EAAG9B,UAAU,GACjBoB,EAAIgS,EAAGpT,SAAS,GAChBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,QACVqK,EAAK,IAAI9J,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAE/BkC,EAAIU,EAAG7B,UAAU,GACjBsB,EAAIQ,EAAG9B,SAAS,GAChBoB,EAAID,EAAEtB,IAAIyB,OACJoK,EAAK,IAAI/J,EAASP,EAAEpC,EAAGoC,EAAEnC,GAEzByU,EAAK,IAAI/R,EAASE,EAAG7C,EAAG6C,EAAG5C,GAE3B0U,EAAOH,EAAGA,EACVI,EAAOH,EAAGA,EAaVpI,EAZO,IAAIxE,EACb2E,EAAGxM,EAAEwM,EAAGxM,EAAE4U,EAAOpI,EAAGvM,EAAEuM,EAAGvM,EAAE0U,EAC3B,GAAGnI,EAAGxM,EAAEyM,EAAGzM,EAAE4U,EAAOpI,EAAGvM,EAAEwM,EAAGxM,EAAE0U,GAC9B,GAAGnI,EAAGxM,EAAE0M,EAAG1M,EAAE4U,EAAOpI,EAAGvM,EAAEyM,EAAGzM,EAAE0U,GAAQlI,EAAGzM,EAAEyM,EAAGzM,EAAE4U,EAAOnI,EAAGxM,EAAEwM,EAAGxM,EAAE0U,EACjE,EAAEnI,EAAGxM,EAAE4U,GAAMF,EAAG1U,EAAIuU,EAAGvU,GAAK,EAAEwM,EAAGvM,EAAE0U,GAAMD,EAAGzU,EAAIsU,EAAGtU,GAC/C,GAAGwM,EAAGzM,EAAE0M,EAAG1M,EAAE4U,EAAOnI,EAAGxM,EAAEyM,EAAGzM,EAAE0U,GAClC,EAAElI,EAAGzM,EAAE4U,GAAMF,EAAG1U,EAAIuU,EAAGvU,GAAK,EAAEyM,EAAGxM,EAAE0U,GAAMD,EAAGzU,EAAIsU,EAAGtU,GAC/CyM,EAAG1M,EAAE0M,EAAG1M,EAAE4U,EAAOlI,EAAGzM,EAAEyM,EAAGzM,EAAE0U,EAC/B,EAAEjI,EAAG1M,EAAE4U,GAAMF,EAAG1U,EAAIuU,EAAGvU,GAAK,EAAE0M,EAAGzM,EAAE0U,GAAMD,EAAGzU,EAAIsU,EAAGtU,GACnDyU,EAAG1U,EAAE0U,EAAG1U,EAAE4U,EAAO,EAAEF,EAAGzU,EAAEsU,EAAGtU,EAAE0U,EAAO,EAAED,EAAG1U,EAAEuU,EAAGvU,EAAE4U,EAC5CF,EAAGzU,EAAEyU,EAAGzU,EAAE0U,EAAOJ,EAAGvU,EAAEuU,EAAGvU,EAAE4U,EAAOL,EAAGtU,EAAEsU,EAAGtU,EAAE0U,EAAOA,EAAKC,GAE7CzI,mBAAmB,EAAG,sCAEzBE,iDAAO,KAAZ5K,UACP+H,EAAOmH,OAAOvH,KACVoD,EAAGxL,SAASS,EAAEA,EAAEA,GAAGZ,IAAI4L,EAAGzL,SAASS,EAAEA,GAAGZ,IAAI6L,EAAG1L,SAASS,GAAGZ,IAAI6T,gGAInElL,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAmBXqH,EAAa0G,qBAAuB,SAAS1U,EAAIC,EAAIsR,EAAIW,EAAI1N,EAAIE,OACzDpF,EAAGG,EAAGF,EAAGG,EAIPR,EAAMsF,EAAGtF,IAAIwF,GACbvF,EAAMqF,EAAGrF,IAAIuF,GACbiC,EAAS,IAAIqH,EAAa,mBAahC1O,EAAIU,EAAG7B,UAAU,GACjBsB,EAAIQ,EAAG9B,SAAS,GAChBoB,EAAIgS,EAAGpT,UAAU,GACjBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,EAAEvB,IAAIkU,SAChBvI,EAAK,IAAI7J,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAE/BkC,EAAIU,EAAG7B,SAAS,GAChBsB,EAAIQ,EAAG9B,UAAU,GACjBoB,EAAIgS,EAAGpT,SAAS,GAChBuB,EAAIJ,EAAEtB,IAAIyB,EAAEzB,IAAIuB,QACVqK,EAAK,IAAI9J,EAASJ,EAAEvC,EAAGuC,EAAEtC,GAE/BkC,EAAIU,EAAG7B,UAAU,GACjBsB,EAAIQ,EAAG9B,SAAS,GAChBoB,EAAID,EAAEtB,IAAIyB,OACJoK,EAAK,IAAI/J,EAASP,EAAEpC,EAAGoC,EAAEnC,GAEzByU,EAAK,IAAI/R,EAASE,EAAG7C,EAAG6C,EAAG5C,GAI3BoI,EAAI,IAAI1F,EAAS0E,EAAGpH,EAAIsH,EAAGtH,EAAGsH,EAAGvH,EAAIqH,EAAGrH,GAGxC8U,EAAKzN,EAAGrH,EAAEuH,EAAGtH,EAAIsH,EAAGvH,EAAEqH,EAAGpH,EAIzBoM,EAAQ,IAAIxE,EACdQ,EAAEpF,IAAIuJ,GACNnE,EAAEpF,IAAIwJ,GACNpE,EAAEpF,IAAIyJ,GACNrE,EAAEpF,IAAIyR,GAAMI,GACdhJ,8CAKcO,iDAAO,KAAZ5K,aACH,GAAKA,GAAKA,GAAK,EAAG,KAGZuT,EAAKnS,EAAGrB,KAAKsB,EAAIrB,GACjBwT,EAAKnS,EAAGtB,KAAK4S,EAAI3S,GACjB+V,EAAKpD,EAAG5S,KAAKuT,EAAItT,GAEjBgW,EAAKzC,EAAGxT,KAAKyT,EAAIxT,GACjBiW,EAAKzC,EAAGzT,KAAKgW,EAAI/V,GAEjBkW,EAAMF,EAAGjW,KAAKkW,EAAIjW,GAKpB4F,EAAGrH,GAAKuH,EAAGvH,EACP+B,EAAI9B,GAAK0X,EAAI1X,GAAK0X,EAAI1X,GAAK+B,EAAI/B,IAC/BuJ,EAAOsH,OAAS,eAChBtH,EAAO0H,YAAYyG,IAGlBtQ,EAAGpH,GAAKsH,EAAGtH,EACZ8B,EAAI/B,GAAK2X,EAAI3X,GAAK2X,EAAI3X,GAAKgC,EAAIhC,IAC/BwJ,EAAOsH,OAAS,eAChBtH,EAAO0H,YAAYyG,IAGlB5V,EAAI/B,GAAK2X,EAAI3X,GAAK2X,EAAI3X,GAAKgC,EAAIhC,GAAK+B,EAAI9B,GAAK0X,EAAI1X,GAAK0X,EAAI1X,GAAK+B,EAAI/B,IACxEuJ,EAAOsH,OAAS,eAChBtH,EAAO0H,YAAYyG,+FAKxBnO,GAcXqH,EAAa+G,wBAA0B,SAAS/U,EAAIC,EAAIsR,EAAIW,EAAIpE,UACrDvQ,KAAKyX,yBAAyBhV,EAAIC,EAAIsR,EAAIW,EAAIrE,EAAaC,KActEE,EAAagH,yBAA2B,SAAShV,EAAIC,EAAIsR,EAAIW,EAAIpE,WACvDnH,EAAS,IAAIqH,EAAa,mBACjBuE,EAAOzE,EAAf5N,OAEE6F,EAAI,EAAGA,EAAIwM,EAAM,EAAGxM,IAAK,KACxBvB,EAAKsJ,EAAO/H,GACZrB,EAAKoJ,EAAO/H,EAAI,GAChBkJ,EAAQjB,EAAa0G,qBAAqB1U,EAAIC,EAAIsR,EAAIW,EAAI1N,EAAIE,GAEpEiC,EAAO4H,aAAaU,EAAMnB,eAG1BnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAeXqH,EAAaiH,0BAA4B,SAASjV,EAAIC,EAAIsR,EAAIW,EAAIO,EAAIC,OAC5DxT,EAAMuT,EAAGvT,IAAIwT,GACbvT,EAAMsT,EAAGtT,IAAIuT,GACbC,EAAW,IAAIzV,EAAQiC,EAAIhC,EAAG+B,EAAI9B,GAClCwV,EAAa,IAAI1V,EAAQgC,EAAI/B,EAAGgC,EAAI/B,GAEpCyV,EAAS7E,EAAa0G,qBAAqB1U,EAAIC,EAAIsR,EAAIW,EAAIhT,EAAKyT,GAChEG,EAAS9E,EAAa0G,qBAAqB1U,EAAIC,EAAIsR,EAAIW,EAAIS,EAAUxT,GACrE4T,EAAS/E,EAAa0G,qBAAqB1U,EAAIC,EAAIsR,EAAIW,EAAI/S,EAAKyT,GAChEI,EAAShF,EAAa0G,qBAAqB1U,EAAIC,EAAIsR,EAAIW,EAAIU,EAAY1T,GAEvEyH,EAAS,IAAIqH,EAAa,0BAEhCrH,EAAO4H,aAAasE,EAAO/E,QAC3BnH,EAAO4H,aAAauE,EAAOhF,QAC3BnH,EAAO4H,aAAawE,EAAOjF,QAC3BnH,EAAO4H,aAAayE,EAAOlF,QAEvBnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAaXqH,EAAakH,sBAAwB,SAASrL,EAAI4I,EAAI7I,EAAI8I,OAClD/L,EAGEwO,EAAQ1C,EAAKC,EACb0C,EAAQ3W,KAAKC,IAAI+T,EAAKC,GAGtB2C,EAASxL,EAAG/K,aAAa8K,MAE3ByL,EAASF,EACTxO,EAAS,IAAIqH,EAAa,gBAEzB,GAAIqH,EAASD,EACdzO,EAAS,IAAIqH,EAAa,cAEzB,CACDrH,EAAS,IAAIqH,EAAa,oBAEpB1O,GAAKmT,EAAGA,EAAKC,EAAGA,EAAK2C,EAAOA,IAAW,EAAEA,GACzCvM,EAAIrK,KAAKQ,KAAKwT,EAAGA,EAAKnT,EAAEA,GACxBgW,EAAIzL,EAAGlL,KAAKiL,EAAItK,EAAE+V,GAClB5V,EAAIqJ,EAAIuM,EAEd1O,EAAOmH,OAAOvH,KACV,IAAIrJ,EACAoY,EAAEnY,EAAIsC,GAAKmK,EAAGxM,EAAIyM,EAAGzM,GACrBkY,EAAElY,EAAIqC,GAAKmK,EAAGzM,EAAI0M,EAAG1M,KAG7BwJ,EAAOmH,OAAOvH,KACV,IAAIrJ,EACAoY,EAAEnY,EAAIsC,GAAKmK,EAAGxM,EAAIyM,EAAGzM,GACrBkY,EAAElY,EAAIqC,GAAKmK,EAAGzM,EAAI0M,EAAG1M,YAK1BwJ,GAcXqH,EAAauH,uBAAyB,SAASC,EAAIhE,EAAGE,EAAIC,EAAIC,UACnD5D,EAAayH,wBAAwBD,EAAIhE,EAAGA,EAAGE,EAAIC,EAAIC,IAalE5D,EAAa0H,oBAAsB,SAASnW,EAAGiS,EAAGhN,EAAIE,OAC9CiC,EACErH,GAAKoF,EAAGvH,EAAIqH,EAAGrH,IAAMuH,EAAGvH,EAAIqH,EAAGrH,IAC3BuH,EAAGtH,EAAIoH,EAAGpH,IAAMsH,EAAGtH,EAAIoH,EAAGpH,GAC9BqC,EAAI,IAAMiF,EAAGvH,EAAIqH,EAAGrH,IAAMqH,EAAGrH,EAAIoC,EAAEpC,IACzBuH,EAAGtH,EAAIoH,EAAGpH,IAAMoH,EAAGpH,EAAImC,EAAEnC,IAGnCuY,EAAQlW,EAAEA,EAAI,EAAEH,GAFXC,EAAEpC,EAAEoC,EAAEpC,EAAIoC,EAAEnC,EAAEmC,EAAEnC,EAAIoH,EAAGrH,EAAEqH,EAAGrH,EAAIqH,EAAGpH,EAAEoH,EAAGpH,EAC1C,GAAKmC,EAAEpC,EAAIqH,EAAGrH,EAAIoC,EAAEnC,EAAIoH,EAAGpH,GAAKoU,EAAEA,MAGvCmE,EAAQ,EACRhP,EAAS,IAAIqH,EAAa,gBAEzB,GAAa,GAAT2H,EACLhP,EAAS,IAAIqH,EAAa,eAGzB,KACKxO,EAAIf,KAAKQ,KAAK0W,GACdC,IAAOnW,EAAID,IAAM,EAAEF,GACnBuW,IAAOpW,EAAID,IAAM,EAAEF,IAEpBsW,EAAK,GAAKA,EAAK,KAAOC,EAAK,GAAKA,EAAK,GAElClP,EAAS,IAAIqH,EADZ4H,EAAK,GAAKC,EAAK,GAAOD,EAAK,GAAKC,EAAK,EACZ,UAGA,WAI9BlP,EAAS,IAAIqH,EAAa,gBAEtB,GAAK4H,GAAMA,GAAM,GACjBjP,EAAOmH,OAAOvH,KAAK/B,EAAG7F,KAAK+F,EAAIkR,IAG/B,GAAKC,GAAMA,GAAM,GACjBlP,EAAOmH,OAAOvH,KAAK/B,EAAG7F,KAAK+F,EAAImR,YAKpClP,GAYXqH,EAAa8H,uBAAyB,SAASvW,EAAGiS,EAAG1D,UAC1CvQ,KAAKwY,wBAAwBxW,EAAGiS,EAAG3D,EAAaC,KAY3DE,EAAa+H,wBAA0B,SAASxW,EAAGiS,EAAG1D,WAG9CmB,EAFEtI,EAAS,IAAIqH,EAAa,mBACjBuE,EAAOzE,EAAf5N,OAGE6F,EAAI,EAAGA,EAAIwM,EAAM,EAAGxM,IAAK,KACxBvB,EAAKsJ,EAAO/H,GACZrB,EAAKoJ,EAAO/H,EAAI,GAEtBkJ,EAAQjB,EAAa0H,oBAAoBnW,EAAGiS,EAAGhN,EAAIE,GACnDiC,EAAO4H,aAAaU,EAAMnB,eAG1BnH,EAAOmH,OAAO5N,OAAS,EACvByG,EAAOsH,OAAS,eAGhBtH,EAAOsH,OAASgB,EAAMhB,OAGnBtH,GAaXqH,EAAagI,yBAA2B,SAASzW,EAAGiS,EAAGiB,EAAIC,OACjDxT,EAAMuT,EAAGvT,IAAIwT,GACbvT,EAAMsT,EAAGtT,IAAIuT,GACbC,EAAW,IAAIzV,EAAQiC,EAAIhC,EAAG+B,EAAI9B,GAClCwV,EAAa,IAAI1V,EAAQgC,EAAI/B,EAAGgC,EAAI/B,GAEpCyV,EAAS7E,EAAa0H,oBAAoBnW,EAAGiS,EAAGtS,EAAKyT,GACrDG,EAAS9E,EAAa0H,oBAAoBnW,EAAGiS,EAAGmB,EAAUxT,GAC1D4T,EAAS/E,EAAa0H,oBAAoBnW,EAAGiS,EAAGrS,EAAKyT,GACrDI,EAAShF,EAAa0H,oBAAoBnW,EAAGiS,EAAGoB,EAAY1T,GAE5DyH,EAAS,IAAIqH,EAAa,0BAEhCrH,EAAO4H,aAAasE,EAAO/E,QAC3BnH,EAAO4H,aAAauE,EAAOhF,QAC3BnH,EAAO4H,aAAawE,EAAOjF,QAC3BnH,EAAO4H,aAAayE,EAAOlF,QAEvBnH,EAAOmH,OAAO5N,OAAS,EACvByG,EAAOsH,OAAS,eAGhBtH,EAAOsH,OAAS4E,EAAO5E,OAGpBtH,GAqBXqH,EAAayH,wBAA0B,SAAS5L,EAAIoM,EAAKC,EAAKtM,EAAIuM,EAAKC,WAC7D9W,EAAI,CACN4W,EAAIA,EAAK,EAAGD,EAAIA,GAAM,EAAEC,EAAIA,EAAIrM,EAAG1M,GAAI,EAAE8Y,EAAIA,EAAIpM,EAAGzM,EACpD8Y,EAAIA,EAAIrM,EAAG1M,EAAE0M,EAAG1M,EAAI8Y,EAAIA,EAAIpM,EAAGzM,EAAEyM,EAAGzM,EAAI6Y,EAAIA,EAAIC,EAAIA,GAElDzW,EAAI,CACN2W,EAAIA,EAAK,EAAGD,EAAIA,GAAM,EAAEC,EAAIA,EAAIxM,EAAGzM,GAAI,EAAEgZ,EAAIA,EAAIvM,EAAGxM,EACpDgZ,EAAIA,EAAIxM,EAAGzM,EAAEyM,EAAGzM,EAAIgZ,EAAIA,EAAIvM,EAAGxM,EAAEwM,EAAGxM,EAAI+Y,EAAIA,EAAIC,EAAIA,GAIlDnG,EADQjC,EAAaqI,OAAO/W,EAAGG,GAChBwJ,WAEfqN,EADU,MACDhX,EAAE,GAAGA,EAAE,GAAK,EAAEA,EAAE,GAAGA,EAAE,GAAKA,EAAE,GAAGA,EAAE,IAC1CiX,EAFU,MAED9W,EAAE,GAAGA,EAAE,GAAK,EAAEA,EAAE,GAAGA,EAAE,GAAKA,EAAE,GAAGA,EAAE,IAC1CkH,EAAS,IAAIqH,EAAa,mBAEvB5Q,EAAI,EAAGA,EAAI6S,EAAO/P,OAAQ9C,YAMzB2S,EALQ,IAAI/K,EACd1F,EAAE,GACFA,EAAE,GAAK2Q,EAAO7S,GAAKkC,EAAE,GACrBA,EAAE,GAAK2Q,EAAO7S,IAAMkC,EAAE,GAAK2Q,EAAO7S,GAAGkC,EAAE,KAEtB2J,WAEZ9L,EAAI,EAAGA,EAAI4S,EAAO7P,OAAQ/C,IAAK,KAChCqZ,GACClX,EAAE,GAAGyQ,EAAO5S,GAAKmC,EAAE,GAAG2Q,EAAO7S,GAAKkC,EAAE,IAAMyQ,EAAO5S,IACjDmC,EAAE,GAAG2Q,EAAO7S,GAAKkC,EAAE,IAAM2Q,EAAO7S,GAAKkC,EAAE,GACxCb,KAAKC,IAAI8X,GAAOF,IAChBE,GACK/W,EAAE,GAAGsQ,EAAO5S,GAAKsC,EAAE,GAAGwQ,EAAO7S,GAAKqC,EAAE,IAAMsQ,EAAO5S,IACjDsC,EAAE,GAAGwQ,EAAO7S,GAAKqC,EAAE,IAAMwQ,EAAO7S,GAAKqC,EAAE,GACxChB,KAAKC,IAAI8X,GAAOD,GAChB5P,EAAO0H,YAAY,IAAInR,EAAQ6S,EAAO5S,GAAI8S,EAAO7S,aAM7DuJ,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAgBXqH,EAAayI,qBAAuB,SAASlX,EAAGoS,EAAIC,EAAIpN,EAAIE,OACpDiC,EACE+P,EAAQ,IAAI5W,EAAS0E,EAAGrH,EAAGqH,EAAGpH,GAC9BuZ,EAAM7W,EAASC,WAAWyE,EAAIE,GAC9B9C,EAAS,IAAI9B,EAASP,EAAEpC,EAAGoC,EAAEnC,GAC7B0I,EAAO4Q,EAAMxY,SAAS0D,GACtBgV,EAAO,IAAI9W,EAAS6W,EAAIxZ,GAAGwU,EAAGA,GAAKgF,EAAIvZ,GAAGwU,EAAGA,IAC7CiF,EAAQ,IAAI/W,EAASgG,EAAK3I,GAAGwU,EAAGA,GAAK7L,EAAK1I,GAAGwU,EAAGA,IAEhDtS,EAAIqX,EAAIvW,IAAIwW,GACZnX,EAAIkX,EAAIvW,IAAIyW,GAEZnX,EAAID,EAAEA,EAAIH,GADhBC,EAAIuG,EAAK1F,IAAIyW,GAAS,MAGlBnX,EAAI,EACJiH,EAAS,IAAIqH,EAAa,gBAEzB,GAAItO,EAAI,EAAG,KACN6J,EAAO9K,KAAKQ,KAAKS,GACjBoX,IAAQrX,EAAI8J,GAAQjK,EACpByX,IAAQtX,EAAI8J,GAAQjK,GAErBwX,EAAM,GAAK,EAAIA,KAASC,EAAM,GAAK,EAAIA,GAEpCpQ,EAAS,IAAIqH,EADZ8I,EAAM,GAAKC,EAAM,GAAOD,EAAM,GAAKC,EAAM,EAChB,UAGA,WAI9BpQ,EAAS,IAAIqH,EAAa,gBACtB,GAAK8I,GAAOA,GAAO,GACnBnQ,EAAO0H,YAAY7J,EAAG7F,KAAK+F,EAAIoS,IAE/B,GAAKC,GAAOA,GAAO,GACnBpQ,EAAO0H,YAAY7J,EAAG7F,KAAK+F,EAAIqS,SAItC,KACKnY,GAAKa,EAAEH,EAET,GAAKV,GAAKA,GAAK,GACf+H,EAAS,IAAIqH,EAAa,iBACnBK,YAAY7J,EAAG7F,KAAK+F,EAAI9F,IAG/B+H,EAAS,IAAIqH,EAAa,kBAI3BrH,GAaXqH,EAAagJ,wBAA0B,SAASzX,EAAGoS,EAAIC,EAAI9D,UAChDvQ,KAAK0Z,yBAAyB1X,EAAGoS,EAAIC,EAAI/D,EAAaC,KAajEE,EAAaiJ,yBAA2B,SAAS1X,EAAGoS,EAAIC,EAAI9D,WAClDnH,EAAS,IAAIqH,EAAa,mBACjBuE,EAAOzE,EAAf5N,OAEE6F,EAAI,EAAGA,EAAIwM,EAAM,EAAGxM,IAAK,KACxBqJ,EAAKtB,EAAO/H,GACZsJ,EAAKvB,EAAO/H,EAAI,GAChBkJ,EAAQjB,EAAayI,qBAAqBlX,EAAGoS,EAAIC,EAAIxC,EAAIC,GAE/D1I,EAAO4H,aAAaU,EAAMnB,eAG1BnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAcXqH,EAAakJ,0BAA4B,SAAS3X,EAAGoS,EAAIC,EAAIa,EAAIC,OACvDxT,EAAMuT,EAAGvT,IAAIwT,GACbvT,EAAMsT,EAAGtT,IAAIuT,GACbC,EAAW,IAAIzV,EAAQiC,EAAIhC,EAAG+B,EAAI9B,GAClCwV,EAAa,IAAI1V,EAAQgC,EAAI/B,EAAGgC,EAAI/B,GAEpCyV,EAAS7E,EAAayI,qBAAqBlX,EAAGoS,EAAIC,EAAI1S,EAAKyT,GAC3DG,EAAS9E,EAAayI,qBAAqBlX,EAAGoS,EAAIC,EAAIe,EAAUxT,GAChE4T,EAAS/E,EAAayI,qBAAqBlX,EAAGoS,EAAIC,EAAIzS,EAAKyT,GAC3DI,EAAShF,EAAayI,qBAAqBlX,EAAGoS,EAAIC,EAAIgB,EAAY1T,GAElEyH,EAAS,IAAIqH,EAAa,0BAEhCrH,EAAO4H,aAAasE,EAAO/E,QAC3BnH,EAAO4H,aAAauE,EAAOhF,QAC3BnH,EAAO4H,aAAawE,EAAOjF,QAC3BnH,EAAO4H,aAAayE,EAAOlF,QAEvBnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAaXqH,EAAamJ,kBAAoB,SAAS3S,EAAIE,EAAI0K,EAAIC,OAC9C1I,EAEEyQ,GAAQ/H,EAAGlS,EAAIiS,EAAGjS,IAAMqH,EAAGpH,EAAIgS,EAAGhS,IAAMiS,EAAGjS,EAAIgS,EAAGhS,IAAMoH,EAAGrH,EAAIiS,EAAGjS,GAClEka,GAAQ3S,EAAGvH,EAAIqH,EAAGrH,IAAMqH,EAAGpH,EAAIgS,EAAGhS,IAAMsH,EAAGtH,EAAIoH,EAAGpH,IAAMoH,EAAGrH,EAAIiS,EAAGjS,GAClEma,GAAOjI,EAAGjS,EAAIgS,EAAGhS,IAAMsH,EAAGvH,EAAIqH,EAAGrH,IAAMkS,EAAGlS,EAAIiS,EAAGjS,IAAMuH,EAAGtH,EAAIoH,EAAGpH,MAE5D,GAAPka,EAAU,KACJC,EAAKH,EAAOE,EACZE,EAAKH,EAAOC,EAEd,GAAKC,GAAMA,GAAM,GAAK,GAAKC,GAAMA,GAAM,GACvC7Q,EAAS,IAAIqH,EAAa,iBACnBF,OAAOvH,KACV,IAAIrJ,EACAsH,EAAGrH,EAAIoa,GAAM7S,EAAGvH,EAAIqH,EAAGrH,GACvBqH,EAAGpH,EAAIma,GAAM7S,EAAGtH,EAAIoH,EAAGpH,KAK/BuJ,EAAS,IAAIqH,EAAa,wBAI9BrH,EAAS,IAAIqH,EADA,GAARoJ,GAAqB,GAARC,EACQ,aAGA,mBAGvB1Q,GAYXqH,EAAayJ,qBAAuB,SAASjT,EAAIE,EAAIoJ,UAC1CvQ,KAAKma,sBAAsBlT,EAAIE,EAAImJ,EAAaC,KAY3DE,EAAa0J,sBAAwB,SAASlT,EAAIE,EAAIoJ,WAC5CnH,EAAS,IAAIqH,EAAa,mBACjBuE,EAAOzE,EAAf5N,OAEE6F,EAAI,EAAGA,EAAIwM,EAAM,EAAGxM,IAAK,KACxBqJ,EAAKtB,EAAO/H,GACZsJ,EAAKvB,EAAO/H,EAAI,GAChBkJ,EAAQjB,EAAamJ,kBAAkB3S,EAAIE,EAAI0K,EAAIC,GAEzD1I,EAAO4H,aAAaU,EAAMnB,eAG1BnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAaXqH,EAAa2J,uBAAyB,SAASnT,EAAIE,EAAI+N,EAAIC,OACjDxT,EAAMuT,EAAGvT,IAAIwT,GACbvT,EAAMsT,EAAGtT,IAAIuT,GACbC,EAAW,IAAIzV,EAAQiC,EAAIhC,EAAG+B,EAAI9B,GAClCwV,EAAa,IAAI1V,EAAQgC,EAAI/B,EAAGgC,EAAI/B,GAEpCyV,EAAS7E,EAAamJ,kBAAkBjY,EAAKyT,EAAUnO,EAAIE,GAC3DoO,EAAS9E,EAAamJ,kBAAkBxE,EAAUxT,EAAKqF,EAAIE,GAC3DqO,EAAS/E,EAAamJ,kBAAkBhY,EAAKyT,EAAYpO,EAAIE,GAC7DsO,EAAShF,EAAamJ,kBAAkBvE,EAAY1T,EAAKsF,EAAIE,GAE7DiC,EAAS,IAAIqH,EAAa,0BAEhCrH,EAAO4H,aAAasE,EAAO/E,QAC3BnH,EAAO4H,aAAauE,EAAOhF,QAC3BnH,EAAO4H,aAAawE,EAAOjF,QAC3BnH,EAAO4H,aAAayE,EAAOlF,QAEvBnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAWXqH,EAAa4J,wBAA0B,SAASC,EAASC,UAC9Cva,KAAKwa,0BAA0BlK,EAAagK,GAAUhK,EAAaiK,KAW9E9J,EAAagK,yBAA2B,SAASH,EAASC,UAC/Cva,KAAKwa,0BAA0BlK,EAAagK,GAAUC,IAYjE9J,EAAaiK,0BAA4B,SAASnK,EAAQ2E,EAAIC,UACnDnV,KAAK2a,2BAA2BrK,EAAaC,GAAS2E,EAAIC,IAWrE1E,EAAa+J,0BAA4B,SAASF,EAASC,WACjDnR,EAAS,IAAIqH,EAAa,mBACjBuE,EAAOsF,EAAf3X,OAEE6F,EAAI,EAAGA,EAAIwM,EAAM,EAAGxM,IAAK,KACxBvB,EAAKqT,EAAQ9R,GACbrB,EAAKmT,EAAQ9R,EAAI,GACjBkJ,EAAQjB,EAAa0J,sBAAsBlT,EAAIE,EAAIoT,GAEzDnR,EAAO4H,aAAaU,EAAMnB,eAG1BnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAYXqH,EAAakK,2BAA6B,SAASpK,EAAQ2E,EAAIC,OACrDxT,EAAMuT,EAAGvT,IAAIwT,GACbvT,EAAMsT,EAAGtT,IAAIuT,GACbC,EAAW,IAAIzV,EAAQiC,EAAIhC,EAAG+B,EAAI9B,GAClCwV,EAAa,IAAI1V,EAAQgC,EAAI/B,EAAGgC,EAAI/B,GAEpCyV,EAAS7E,EAAa0J,sBAAsBxY,EAAKyT,EAAU7E,GAC3DgF,EAAS9E,EAAa0J,sBAAsB/E,EAAUxT,EAAK2O,GAC3DiF,EAAS/E,EAAa0J,sBAAsBvY,EAAKyT,EAAY9E,GAC7DkF,EAAShF,EAAa0J,sBAAsB9E,EAAY1T,EAAK4O,GAE7DnH,EAAS,IAAIqH,EAAa,0BAEhCrH,EAAO4H,aAAasE,EAAO/E,QAC3BnH,EAAO4H,aAAauE,EAAOhF,QAC3BnH,EAAO4H,aAAawE,EAAOjF,QAC3BnH,EAAO4H,aAAayE,EAAOlF,QAEvBnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAaXqH,EAAamK,4BAA8B,SAAS3T,EAAIE,EAAI0K,EAAIC,OACtDnQ,EAAMsF,EAAGtF,IAAIwF,GACbvF,EAAMqF,EAAGrF,IAAIuF,GACbiO,EAAW,IAAIzV,EAAQiC,EAAIhC,EAAG+B,EAAI9B,GAClCwV,EAAa,IAAI1V,EAAQgC,EAAI/B,EAAGgC,EAAI/B,GAEpCyV,EAAS7E,EAAa2J,uBAAuBzY,EAAKyT,EAAUvD,EAAIC,GAChEyD,EAAS9E,EAAa2J,uBAAuBhF,EAAUxT,EAAKiQ,EAAIC,GAChE0D,EAAS/E,EAAa2J,uBAAuBxY,EAAKyT,EAAYxD,EAAIC,GAClE2D,EAAShF,EAAa2J,uBAAuB/E,EAAY1T,EAAKkQ,EAAIC,GAElE1I,EAAS,IAAIqH,EAAa,0BAEhCrH,EAAO4H,aAAasE,EAAO/E,QAC3BnH,EAAO4H,aAAauE,EAAOhF,QAC3BnH,EAAO4H,aAAawE,EAAOjF,QAC3BnH,EAAO4H,aAAayE,EAAOlF,QAEvBnH,EAAOmH,OAAO5N,OAAS,IACvByG,EAAOsH,OAAS,gBAGbtH,GAaXqH,EAAaoK,gBAAkB,SAAS5T,EAAIE,EAAI0K,EAAIC,OAC5C1I,EAEEyQ,GAAQ/H,EAAGlS,EAAIiS,EAAGjS,IAAMqH,EAAGpH,EAAIgS,EAAGhS,IAAMiS,EAAGjS,EAAIgS,EAAGhS,IAAMoH,EAAGrH,EAAIiS,EAAGjS,GAClEka,GAAQ3S,EAAGvH,EAAIqH,EAAGrH,IAAMqH,EAAGpH,EAAIgS,EAAGhS,IAAMsH,EAAGtH,EAAIoH,EAAGpH,IAAMoH,EAAGrH,EAAIiS,EAAGjS,GAClEma,GAAOjI,EAAGjS,EAAIgS,EAAGhS,IAAMsH,EAAGvH,EAAIqH,EAAGrH,IAAMkS,EAAGlS,EAAIiS,EAAGjS,IAAMuH,EAAGtH,EAAIoH,EAAGpH,MAE5D,GAAPka,EAAU,KACJC,EAAKH,EAAOE,GAElB3Q,EAAS,IAAIqH,EAAa,iBACnBF,OAAOvH,KACV,IAAIrJ,EACAsH,EAAGrH,EAAIoa,GAAM7S,EAAGvH,EAAIqH,EAAGrH,GACvBqH,EAAGpH,EAAIma,GAAM7S,EAAGtH,EAAIoH,EAAGpH,UAK/BuJ,EAAS,IAAIqH,EADA,GAARoJ,GAAqB,GAARC,EACQ,aAGA,mBAGvB1Q,GAeXqH,EAAaqI,OAAS,SAAShD,EAAIC,OACzB+E,EAAKhF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BiF,EAAKjF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BkF,EAAKlF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BmF,EAAKnF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BoF,EAAKpF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BqF,EAAKrF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BsF,EAAKtF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BuF,EAAKvF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5BwF,EAAKxF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5ByF,EAAKzF,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5B0F,EAAK1F,EAAG,GAAGC,EAAG,GAAKA,EAAG,GAAGD,EAAG,GAC5B2F,EAAQJ,EAAKE,EACbG,EAAQN,EAAKE,SAEZ,IAAI7T,EACPqT,EAAGK,EAAKJ,EAAGA,EACXD,EAAGY,EAAQV,EAAGG,EAAK,EAAEJ,EAAGE,EACxBH,EAAGW,EAAQT,EAAGU,EAAQT,EAAGA,EAAK,EAAEF,EAAGG,EACnCJ,EAAGU,EAAKR,EAAGS,EAAQ,EAAER,EAAGC,EACxBF,EAAGQ,EAAKN,EAAGA,ICzsDnBvK,EAAiBrQ,UAAUoH,KAAO,SAASkJ,EAAMC,QACxCD,KAAOA,OACPC,KAAOA,GCjBhB,IAAM8K,EAAS,CAafA,gBAAyB,SAASC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,UAChD,IAAItL,EAAiB,UAAW,CACnC,IAAIhR,EAAQic,EAAKC,GACjB,IAAIlc,EAAQmc,EAAKC,GACjB,IAAIpc,EAAQqc,EAAKC,MAkBzBN,YAAqB,SAASC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,UACtD,IAAIxL,EAAiB,UAAW,CACnC,IAAIhR,EAAQic,EAAKC,GACjB,IAAIlc,EAAQmc,EAAKC,GACjB,IAAIpc,EAAQqc,EAAKC,GACjB,IAAItc,EAAQuc,EAAKC,MAazBR,OAAgB,SAASS,EAASC,EAASC,UAChC,IAAI3L,EAAiB,SAAU,CAClC,IAAIhR,EAAQyc,EAASC,GACrBC,KAcRX,QAAiB,SAASS,EAASC,EAASE,EAASC,UAC1C,IAAI7L,EAAiB,UAAW,CACnC,IAAIhR,EAAQyc,EAASC,GACrBE,EACAC,KAcRb,KAAc,SAASC,EAAKC,EAAKC,EAAKC,UAC3B,IAAIpL,EAAiB,OAAQ,CAChC,IAAIhR,EAAQic,EAAKC,GACjB,IAAIlc,EAAQmc,EAAKC,MAWzBJ,KAAc,SAASc,UACZ,IAAI9L,EAAiB,OAAQ8L,IAUxCd,QAAiB,SAASe,WAChBnM,EAAS,GAEN/H,EAAI,EAAGA,EAAIkU,EAAO/Z,OAAQ6F,GAAK,EACpC+H,EAAOvH,KAAK,IAAIrJ,EAAQ+c,EAAOlU,GAAIkU,EAAOlU,EAAI,YAG3C,IAAImI,EAAiB,UAAW,CAACJ,KAU5CoL,SAAkB,SAASe,WACjBnM,EAAS,GAEN/H,EAAI,EAAGA,EAAIkU,EAAO/Z,OAAQ6F,GAAK,EACpC+H,EAAOvH,KAAK,IAAIrJ,EAAQ+c,EAAOlU,GAAIkU,EAAOlU,EAAI,YAG3C,IAAImI,EAAiB,WAAY,CAACJ,KAa7CoL,UAAmB,SAAS/b,EAAGC,EAAG8c,EAAOC,UAC9B,IAAIjM,EAAiB,YAAa,CACrC,IAAIhR,EAAQC,EAAGC,GACf,IAAIF,EAAQC,EAAI+c,EAAO9c,EAAI+c,OC3J7BC,EAAe,CAUrBA,gBAA+B,SAASpa,EAAIC,EAAIsR,UACrC,IAAIrD,EAAiB,UAAW,CAAClO,EAAIC,EAAIsR,KAapD6I,YAA2B,SAASpa,EAAIC,EAAIsR,EAAIW,UACrC,IAAIhE,EAAiB,UAAW,CAAClO,EAAIC,EAAIsR,EAAIW,KAWxDkI,OAAsB,SAASxY,EAAQiY,UAC5B,IAAI3L,EAAiB,SAAU,CAACtM,EAAQiY,KAYnDO,QAAuB,SAASxY,EAAQkY,EAASC,UACtC,IAAI7L,EAAiB,UAAW,CAACtM,EAAQkY,EAASC,KAW7DK,KAAoB,SAASpa,EAAIC,UACtB,IAAIiO,EAAiB,OAAQ,CAAClO,EAAIC,KAU7Cma,KAAoB,SAASJ,UAClB,IAAI9L,EAAiB,OAAQ,CAAC8L,KAUzCI,QAAuB,SAAStM,UACrB,IAAII,EAAiB,UAAW,CAACJ,KAU5CsM,SAAwB,SAAStM,UACtB,IAAII,EAAiB,WAAY,CAACJ,KAW7CsM,UAAyB,SAASC,EAASC,UAChC,IAAIpM,EAAiB,YAAa,CAACmM,EAASA,EAAQrc,IAAIsc,OCtG7DC,EAAoB,CAW1BA,cAAkC,SAASjM,EAAO1M,EAAQiY,UAC5C/Z,EAASC,WAAW6B,EAAQ0M,GAE7BpO,UAAY2Z,GAazBU,eAAmC,SAASjM,EAAO1M,EAAQkY,EAASC,OAC1DxH,EAAMjE,EAAMpQ,SAAS0D,UAEnB2Q,EAAIpV,EAAIoV,EAAIpV,GAAM2c,EAAUA,GAAYvH,EAAInV,EAAImV,EAAInV,GAAM2c,EAAUA,IAAY,GAU5FQ,gBAAoC,SAASjM,EAAOR,WAG5C0M,EAFWjI,EAAOzE,EAAf5N,OACHua,EAAU,EAGVza,EAAK8N,EAAO,GAEP/H,EAAI,EAAGA,GAAKwM,EAAKxM,IAAK,KACrB9F,EAAK6N,EAAO/H,EAAIwM,GAChBmI,EAAOjc,KAAKS,IAAIc,EAAG5C,EAAG6C,EAAG7C,GACzBud,EAAOlc,KAAKU,IAAIa,EAAG5C,EAAG6C,EAAG7C,GACzB+N,EAAO1M,KAAKU,IAAIa,EAAG7C,EAAG8C,EAAG9C,GAE3B6C,EAAG5C,IAAM6C,EAAG7C,GAAKsd,EAAOpM,EAAMlR,GAAKkR,EAAMlR,GAAKud,GAAQrM,EAAMnR,GAAKgO,IACjEqP,GAAUlM,EAAMlR,EAAI4C,EAAG5C,IAAM6C,EAAG9C,EAAI6C,EAAG7C,IAAM8C,EAAG7C,EAAI4C,EAAG5C,GAAK4C,EAAG7C,GAE3D6C,EAAG7C,IAAM8C,EAAG9C,GAAKmR,EAAMnR,GAAKqd,IAC5BC,KAIRza,EAAKC,SAGDwa,EAAU,GAAM,IAU5BF,EAAkBK,eAAiBL,EAAkBM,gBAWrDN,EAAkBO,iBAAmB,SAASxM,EAAO+L,EAASU,UAEtDV,EAAQld,GAAKmR,EAAMnR,GAAKmR,EAAMnR,EAAI4d,EAAY5d,GAC9Ckd,EAAQjd,GAAKkR,EAAMlR,GAAKkR,EAAMlR,EAAI2d,EAAY3d"} \ No newline at end of file +{"version":3,"file":"index-umd.min.js","sources":["../node_modules/kld-affine/lib/Point2D.js","../node_modules/kld-affine/lib/Vector2D.js","../node_modules/kld-affine/lib/Matrix2D.js","../node_modules/kld-affine/index.js","../node_modules/kld-polynomial/lib/Polynomial.js","../node_modules/kld-polynomial/lib/SqrtPolynomial.js","../node_modules/kld-polynomial/index.js","../lib/Intersection.js","../lib/IntersectionArgs.js","../lib/Shapes.js","../lib/AffineShapes.js","../lib/IntersectionQuery.js"],"sourcesContent":["/**\n *\n * Point2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Point2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Point2D}\n */\nfunction Point2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * clone\n *\n * @returns {Point2D}\n */\nPoint2D.prototype.clone = function() {\n return new this.constructor(this.x, this.y);\n};\n\n/**\n * add\n *\n * @param {Point2D|Vector2D} that\n * @returns {Point2D}\n */\nPoint2D.prototype.add = function(that) {\n return new this.constructor(this.x+that.x, this.y+that.y);\n};\n\n/**\n * subtract\n *\n * @param { Vector2D | Point2D } that\n * @returns {Point2D}\n */\nPoint2D.prototype.subtract = function(that) {\n return new this.constructor(this.x-that.x, this.y-that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x*scalar, this.y*scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x/scalar, this.y/scalar);\n};\n\n/**\n * equals\n *\n * @param {Point2D} that\n * @returns {Boolean}\n */\nPoint2D.prototype.equals = function(that) {\n return ( this.x === that.x && this.y === that.y );\n};\n\n/**\n * precisionEquals\n *\n * @param {Point2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nPoint2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n// utility methods\n\n/**\n * lerp\n *\n * @param { Vector2D | Point2D } that\n * @param {Number} t\n @ @returns {Point2D}\n */\nPoint2D.prototype.lerp = function(that, t) {\n var omt = 1.0 - t;\n\n return new this.constructor(\n this.x * omt + that.x * t,\n this.y * omt + that.y * t\n );\n};\n\n/**\n * distanceFrom\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.distanceFrom = function(that) {\n var dx = this.x - that.x;\n var dy = this.y - that.y;\n\n return Math.sqrt(dx*dx + dy*dy);\n};\n\n/**\n * min\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.min = function(that) {\n return new this.constructor(\n Math.min( this.x, that.x ),\n Math.min( this.y, that.y )\n );\n};\n\n/**\n * max\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.max = function(that) {\n return new this.constructor(\n Math.max( this.x, that.x ),\n Math.max( this.y, that.y )\n );\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @result {Point2D}\n */\nPoint2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y + matrix.e,\n matrix.b * this.x + matrix.d * this.y + matrix.f\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nPoint2D.prototype.toString = function() {\n return \"point(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Point2D;\n}\n","/**\n *\n * Vector2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Vector2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Vector2D}\n */\nfunction Vector2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * fromPoints\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {Vector2D}\n */\nVector2D.fromPoints = function(p1, p2) {\n return new Vector2D(\n p2.x - p1.x,\n p2.y - p1.y\n );\n};\n\n/**\n * length\n *\n * @returns {Number}\n */\nVector2D.prototype.length = function() {\n return Math.sqrt(this.x*this.x + this.y*this.y);\n};\n\n/**\n * magnitude\n *\n * @returns {Number}\n */\nVector2D.prototype.magnitude = function() {\n return this.x*this.x + this.y*this.y;\n};\n\n/**\n * dot\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.dot = function(that) {\n return this.x*that.x + this.y*that.y;\n};\n\n/**\n * cross\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.cross = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * determinant\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.determinant = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * unit\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.unit = function() {\n return this.divide( this.length() );\n};\n\n/**\n * add\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.add = function(that) {\n return new this.constructor(this.x + that.x, this.y + that.y);\n};\n\n/**\n * subtract\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.subtract = function(that) {\n return new this.constructor(this.x - that.x, this.y - that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x * scalar, this.y * scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x / scalar, this.y / scalar);\n};\n\n/**\n * angleBetween\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.angleBetween = function(that) {\n var cos = this.dot(that) / (this.length() * that.length());\n cos = Math.max(-1, Math.min(cos, 1));\n var radians = Math.acos(cos);\n\n return (this.cross(that) < 0.0) ? -radians : radians;\n};\n\n/**\n * Find a vector is that is perpendicular to this vector\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.perp = function() {\n return new this.constructor(-this.y, this.x);\n};\n\n/**\n * Find the component of the specified vector that is perpendicular to\n * this vector\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.perpendicular = function(that) {\n return this.subtract(this.project(that));\n};\n\n/**\n * project\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.project = function(that) {\n var percent = this.dot(that) / that.dot(that);\n\n return that.multiply(percent);\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @returns {Vector2D}\n */\nVector2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y,\n matrix.b * this.x + matrix.d * this.y\n );\n};\n\n/**\n * equals\n *\n * @param {Vector2D} that\n * @returns {Boolean}\n */\nVector2D.prototype.equals = function(that) {\n return (\n this.x === that.x &&\n this.y === that.y\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Vector2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nVector2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nVector2D.prototype.toString = function() {\n return \"vector(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Vector2D;\n}\n","/**\n * Matrix2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n */\n\nfunction setReadonlyProperty(object, property, value) {\n Object.defineProperty(object, property, {\n value: value,\n writable: false,\n enumerable: true,\n configurable: false\n });\n}\n\n/**\n * Identity matrix\n *\n * @returns {Matrix2D}\n */\nsetReadonlyProperty(Matrix2D, \"IDENTITY\", new Matrix2D(1, 0, 0, 1, 0, 0));\nsetReadonlyProperty(Matrix2D.IDENTITY, \"isIdentity\", function () { return true; });\n\n\n/**\n * Matrix2D\n *\n * [a c e]\n * [b d f]\n * [0 0 1]\n *\n * @param {Number} a\n * @param {Number} b\n * @param {Number} c\n * @param {Number} d\n * @param {Number} e\n * @param {Number} f\n * @returns {Matrix2D}\n */\nfunction Matrix2D(a, b, c, d, e, f) {\n setReadonlyProperty(this, \"a\", (a !== undefined) ? a : 1);\n setReadonlyProperty(this, \"b\", (b !== undefined) ? b : 0);\n setReadonlyProperty(this, \"c\", (c !== undefined) ? c : 0);\n setReadonlyProperty(this, \"d\", (d !== undefined) ? d : 1);\n setReadonlyProperty(this, \"e\", (e !== undefined) ? e : 0);\n setReadonlyProperty(this, \"f\", (f !== undefined) ? f : 0);\n}\n\n\n// *** STATIC METHODS\n\n/**\n * translation\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.translation = function(tx, ty) {\n return new Matrix2D(1, 0, 0, 1, tx, ty);\n};\n\n/**\n * scaling\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.scaling = function(scale) {\n return new Matrix2D(scale, 0, 0, scale, 0, 0);\n};\n\n/**\n * scalingAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.scalingAt = function(scale, center) {\n return new Matrix2D(\n scale,\n 0,\n 0,\n scale,\n center.x - center.x * scale,\n center.y - center.y * scale\n );\n}\n\n\n/**\n * nonUniformScaling\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScaling = function(scaleX, scaleY) {\n return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0);\n};\n\n/**\n * nonUniformScalingAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScalingAt = function(scaleX, scaleY, center) {\n return new Matrix2D(\n scaleX,\n 0,\n 0,\n scaleY,\n center.x - center.x * scaleX,\n center.y - center.y * scaleY\n );\n};\n\n/**\n * rotation\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.rotation = function(radians) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * rotationAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.rotationAt = function(radians, center) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(\n c,\n s,\n -s,\n c,\n center.x - center.x * c + center.y * s,\n center.y - center.y * c - center.x * s\n );\n};\n\n/**\n * rotationFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.rotationFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * xFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.xFlip = function() {\n return new Matrix2D(-1, 0, 0, 1, 0, 0);\n};\n\n/**\n * yFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.yFlip = function() {\n return new Matrix2D(1, 0, 0, -1, 0, 0);\n};\n\n/**\n * xSkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.xSkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, 0, t, 1, 0, 0);\n};\n\n/**\n * ySkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.ySkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, t, 0, 1, 0, 0);\n};\n\n\n// *** METHODS\n\n/**\n * multiply\n *\n * @pararm {Matrix2D} that\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.multiply = function (that) {\n if (this.isIdentity()) {\n return that;\n }\n\n if (that.isIdentity()) {\n return this;\n }\n\n return new this.constructor(\n this.a * that.a + this.c * that.b,\n this.b * that.a + this.d * that.b,\n this.a * that.c + this.c * that.d,\n this.b * that.c + this.d * that.d,\n this.a * that.e + this.c * that.f + this.e,\n this.b * that.e + this.d * that.f + this.f\n );\n};\n\n/**\n * inverse\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.inverse = function () {\n if (this.isIdentity()) {\n return this;\n }\n\n var det1 = this.a * this.d - this.b * this.c;\n\n if ( det1 === 0.0 ) {\n throw(\"Matrix is not invertible\");\n }\n\n var idet = 1.0 / det1;\n var det2 = this.f * this.c - this.e * this.d;\n var det3 = this.e * this.b - this.f * this.a;\n\n return new this.constructor(\n this.d * idet,\n -this.b * idet,\n -this.c * idet,\n this.a * idet,\n det2 * idet,\n det3 * idet\n );\n};\n\n/**\n * translate\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.translate = function(tx, ty) {\n return new this.constructor(\n this.a,\n this.b,\n this.c,\n this.d,\n this.a * tx + this.c * ty + this.e,\n this.b * tx + this.d * ty + this.f\n );\n};\n\n/**\n * scale\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scale = function(scale) {\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleAt = function(scale, center) {\n var dx = center.x - scale * center.x;\n var dy = center.y - scale * center.y;\n\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * scaleNonUniform\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniform = function(scaleX, scaleY) {\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleNonUniformAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniformAt = function(scaleX, scaleY, center) {\n var dx = center.x - scaleX * center.x;\n var dy = center.y - scaleY * center.y;\n\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * rotate\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotate = function(radians) {\n var c = Math.cos(radians);\n var s = Math.sin(radians);\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * rotateAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @result {Matrix2D}\n */\nMatrix2D.prototype.rotateAt = function(radians, center) {\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var cx = center.x;\n var cy = center.y;\n\n var a = this.a * cos + this.c * sin;\n var b = this.b * cos + this.d * sin;\n var c = this.c * cos - this.a * sin;\n var d = this.d * cos - this.b * sin;\n\n return new this.constructor(\n a,\n b,\n c,\n d,\n (this.a - a) * cx + (this.c - c) * cy + this.e,\n (this.b - b) * cx + (this.d - d) * cy + this.f\n );\n};\n\n/**\n * rotateFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotateFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * flipX\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipX = function() {\n return new this.constructor(\n -this.a,\n -this.b,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * flipY\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipY = function() {\n return new this.constructor(\n this.a,\n this.b,\n -this.c,\n -this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * skewX\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewX = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a,\n this.b,\n this.c + this.a * t,\n this.d + this.b * t,\n this.e,\n this.f\n );\n};\n\n// TODO: skewXAt\n\n/**\n * skewY\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewY = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a + this.c * t,\n this.b + this.d * t,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n// TODO: skewYAt\n\n/**\n * isIdentity\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isIdentity = function() {\n return (\n this.a === 1.0 &&\n this.b === 0.0 &&\n this.c === 0.0 &&\n this.d === 1.0 &&\n this.e === 0.0 &&\n this.f === 0.0\n );\n};\n\n/**\n * isInvertible\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isInvertible = function() {\n return this.a * this.d - this.b * this.c !== 0.0;\n};\n\n/**\n * getScale\n *\n * @returns {{ scaleX: Number, scaleY: Number }}\n */\nMatrix2D.prototype.getScale = function() {\n return {\n scaleX: Math.sqrt(this.a * this.a + this.c * this.c),\n scaleY: Math.sqrt(this.b * this.b + this.d * this.d)\n };\n};\n\n/**\n * getDecomposition\n *\n * Calculates matrix Singular Value Decomposition\n *\n * The resulting matrices, translation, rotation, scale, and rotation0, return\n * this matrix when they are muliplied together in the listed order\n *\n * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688}\n * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation}\n *\n * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }}\n */\nMatrix2D.prototype.getDecomposition = function () {\n var E = (this.a + this.d) * 0.5;\n var F = (this.a - this.d) * 0.5;\n var G = (this.b + this.c) * 0.5;\n var H = (this.b - this.c) * 0.5;\n\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n var scaleX = Q + R;\n var scaleY = Q - R;\n\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n var theta = (a2 - a1) * 0.5;\n var phi = (a2 + a1) * 0.5;\n\n // TODO: Add static methods to generate translation, rotation, etc.\n // matrices directly\n\n return {\n translation: new this.constructor(1, 0, 0, 1, this.e, this.f),\n rotation: this.constructor.IDENTITY.rotate(phi),\n scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0),\n rotation0: this.constructor.IDENTITY.rotate(theta)\n };\n};\n\n/**\n * equals\n *\n * @param {Matrix2D} that\n * @returns {Boolean}\n */\nMatrix2D.prototype.equals = function(that) {\n return (\n this.a === that.a &&\n this.b === that.b &&\n this.c === that.c &&\n this.d === that.d &&\n this.e === that.e &&\n this.f === that.f\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Matrix2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nMatrix2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.a - that.a) < precision &&\n Math.abs(this.b - that.b) < precision &&\n Math.abs(this.c - that.c) < precision &&\n Math.abs(this.d - that.d) < precision &&\n Math.abs(this.e - that.e) < precision &&\n Math.abs(this.f - that.f) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nMatrix2D.prototype.toString = function() {\n return \"matrix(\" + [this.a, this.b, this.c, this.d, this.e, this.f].join(\",\") + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Matrix2D;\n}\n","// expose classes\n\nexports.Point2D = require('./lib/Point2D');\nexports.Vector2D = require('./lib/Vector2D');\nexports.Matrix2D = require('./lib/Matrix2D');\n","/**\n *\n * Polynomial.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n * \n * contribution {@link http://github.com/Quazistax/kld-polynomial}\n * @copyright 2015 Robert Benko (Quazistax) \n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n */\nclass Intersection {\n /**\n * @param {string} status\n */\n constructor(status) {\n this.init(status);\n }\n\n\n /**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\n init(status) {\n this.status = status;\n this.points = [];\n }\n\n\n /**\n * appendPoint\n *\n * @param {Point2D} point\n */\n appendPoint(point) {\n this.points.push(point);\n }\n\n\n /**\n * appendPoints\n *\n * @param {Array} points\n */\n appendPoints(points) {\n this.points = this.points.concat(points);\n }\n}\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n */\nclass IntersectionArgs {\n /**\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\n constructor(name, args) {\n this.init(name, args);\n }\n /**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\n init(name, args) {\n this.name = name;\n this.args = args;\n }\n}\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","point","intersect","shape1","shape2","name","intersectPathShape","method","args","apply","path","shape","segment","inter","appendPoints","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","appendPoint","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","IntersectionArgs","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file diff --git a/examples/PathHandler.js b/examples/PathHandler.js index 05468ab..2c69dde 100644 --- a/examples/PathHandler.js +++ b/examples/PathHandler.js @@ -8,427 +8,426 @@ import {Shapes} from "../index.js"; /** * PathHandler - * - * @class - */ -function PathHandler() { - this.shapes = []; - this.firstX = null; - this.firstY = null; - this.lastX = null; - this.lastY = null; - this.lastCommand = null; -} - -/** - * beginParse - */ -PathHandler.prototype.beginParse = function() { - // zero out the sub-path array - this.shapes = []; - - // clear firstX, firstY, lastX, and lastY - this.firstX = null; - this.firstY = null; - this.lastX = null; - this.lastY = null; - - // need to remember last command type to determine how to handle the - // relative Bezier commands - this.lastCommand = null; -}; - -/** - * addShape - * - * @param {IntersectionArgs} shape - */ -PathHandler.prototype.addShape = function(shape) { - this.shapes.push(shape); -}; - -/** - * arcAbs - A - * - * @param {number} rx - * @param {number} ry - * @param {number} xAxisRotation - * @param {boolean} largeArcFlag - * @param {boolean} sweepFlag - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.arcAbs = function(rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y) { - // TODO: implement once we support arcs - this.lastCommand = "A"; - throw new Error("Not yet supported!"); -}; - -/** - * arcRel - a - * - * @param {number} rx - * @param {number} ry - * @param {number} xAxisRotation - * @param {boolean} largeArcFlag - * @param {boolean} sweepFlag - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.arcRel = function(rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y) { - // TODO: implement once we support arcs - this.lastCommand = "a"; - throw new Error("Not yet supported!"); -}; - -/** - * curvetoCubicAbs - C - * - * @param {number} x1 - * @param {number} y1 - * @param {number} x2 - * @param {number} y2 - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.curvetoCubicAbs = function(x1, y1, x2, y2, x, y) { - this.addShape(Shapes.cubicBezier( - this.lastX, this.lastY, - x1, y1, - x2, y2, - x, y - )); - - this.lastX = x; - this.lastY = y; - this.lastCommand = "C"; -}; - -/** - * curvetoCubicRel - c - * - * @param {number} x1 - * @param {number} y1 - * @param {number} x2 - * @param {number} y2 - * @param {number} x - * @param {number} y */ -PathHandler.prototype.curvetoCubicRel = function(x1, y1, x2, y2, x, y) { - this.addShape(Shapes.cubicBezier( - this.lastX, this.lastY, - this.lastX + x1, this.lastY + y1, - this.lastX + x2, this.lastY + y2, - this.lastX + x, this.lastY + y - )); - - this.lastX += x; - this.lastY += y; - this.lastCommand = "c"; -}; - -/** - * linetoHorizontalAbs - H - * - * @param {number} x - */ -PathHandler.prototype.linetoHorizontalAbs = function(x) { - this.addShape(Shapes.line( - this.lastX, this.lastY, - x, this.lastY - )); - - this.lastX = x; - this.lastCommand = "H"; -}; - -/** - * linetoHorizontalRel - h - * - * @param {number} x - */ -PathHandler.prototype.linetoHorizontalRel = function(x) { - this.addShape(Shapes.line( - this.lastX, this.lastY, - this.lastX + x, this.lastY - )); - - this.lastX += x; - this.lastCommand = "h"; -}; - -/** - * linetoAbs - L - * - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.linetoAbs = function(x, y) { - this.addShape(Shapes.line( - this.lastX, this.lastY, - x, y - )); - - this.lastX = x; - this.lastY = y; - this.lastCommand = "L"; -}; - -/** - * linetoRel - l - * - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.linetoRel = function(x, y) { - this.addShape(Shapes.line( - this.lastX, this.lastY, - this.lastX + x, this.lastY + y - )); - - this.lastX += x; - this.lastY += y; - this.lastCommand = "l"; -}; - -/** - * movetoAbs - M - * - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.movetoAbs = function(x, y) { - this.firstX = x; - this.firstY = y; - this.lastX = x; - this.lastY = y; - this.lastCommand = "M"; -}; - -/** - * movetoRel - m - * - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.movetoRel = function(x, y) { - this.firstX += x; - this.firstY += y; - this.lastX += x; - this.lastY += y; - this.lastCommand = "m"; -}; - -/** - * curvetoQuadraticAbs - Q - * - * @param {number} x1 - * @param {number} y1 - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.curvetoQuadraticAbs = function(x1, y1, x, y) { - this.addShape(Shapes.quadraticBezier( - this.lastX, this.lastY, - x1, y1, - x, y - )); - - this.lastX = x; - this.lastY = y; - this.lastCommand = "Q"; -}; - -/** - * curvetoQuadraticRel - q - * - * @param {number} x1 - * @param {number} y1 - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.curvetoQuadraticRel = function(x1, y1, x, y) { - this.addShape(Shapes.quadraticBezier( - this.lastX, this.lastY, - this.lastX + x1, this.lastY + y1, - this.lastX + x, this.lastY + y - )); - - this.lastX += x; - this.lastY += y; - this.lastCommand = "q"; -}; - -/** - * curvetoCubicSmoothAbs - S - * - * @param {number} x2 - * @param {number} y2 - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.curvetoCubicSmoothAbs = function(x2, y2, x, y) { - let controlX, controlY; - - if (this.lastCommand.match(/^[SsCc]$/)) { - const secondToLast = this.shapes[this.shapes.length - 1].args[2]; - - controlX = 2 * this.lastX - secondToLast.x; - controlY = 2 * this.lastX - secondToLast.y; +class PathHandler { + constructor() { + this.shapes = []; + this.firstX = null; + this.firstY = null; + this.lastX = null; + this.lastY = null; + this.lastCommand = null; } - else { - controlX = this.lastX; - controlY = this.lastY; + /** + * beginParse + */ + beginParse() { + // zero out the sub-path array + this.shapes = []; + + // clear firstX, firstY, lastX, and lastY + this.firstX = null; + this.firstY = null; + this.lastX = null; + this.lastY = null; + + // need to remember last command type to determine how to handle the + // relative Bezier commands + this.lastCommand = null; } - this.addShape(Shapes.cubicBezier( - controlX, controlY, - x2, y2, - x, y - )); - - this.lastX = x; - this.lastY = y; - this.lastCommand = "S"; -}; - -/** - * curvetoCubicSmoothRel - s - * - * @param {number} x2 - * @param {number} y2 - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.curvetoCubicSmoothRel = function(x2, y2, x, y) { - let controlX, controlY; - - if (this.lastCommand.match(/^[SsCc]$/)) { - const secondToLast = this.shapes[this.shapes.length - 1].args[2]; + /** + * addShape + * + * @param {IntersectionArgs} shape + */ + addShape(shape) { + this.shapes.push(shape); + } - controlX = 2 * this.lastX - secondToLast.x; - controlY = 2 * this.lastY - secondToLast.y; + /** + * arcAbs - A + * + * @param {number} rx + * @param {number} ry + * @param {number} xAxisRotation + * @param {boolean} largeArcFlag + * @param {boolean} sweepFlag + * @param {number} x + * @param {number} y + */ + arcAbs(rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y) { + // TODO: implement once we support arcs + this.lastCommand = "A"; + throw new Error("Not yet supported!"); } - else { - controlX = this.lastX; - controlY = this.lastY; + + /** + * arcRel - a + * + * @param {number} rx + * @param {number} ry + * @param {number} xAxisRotation + * @param {boolean} largeArcFlag + * @param {boolean} sweepFlag + * @param {number} x + * @param {number} y + */ + arcRel(rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y) { + // TODO: implement once we support arcs + this.lastCommand = "a"; + throw new Error("Not yet supported!"); } - this.addShape(Shapes.cubicBezier( - controlX, controlY, - this.lastX + x2, this.lastY + y2, - this.lastX + x, this.lastY + y - )); + /** + * curvetoCubicAbs - C + * + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + */ + curvetoCubicAbs(x1, y1, x2, y2, x, y) { + this.addShape(Shapes.cubicBezier( + this.lastX, this.lastY, + x1, y1, + x2, y2, + x, y + )); + + this.lastX = x; + this.lastY = y; + this.lastCommand = "C"; + } - this.lastX += x; - this.lastY += y; - this.lastCommand = "s"; -}; + /** + * curvetoCubicRel - c + * + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + */ + curvetoCubicRel(x1, y1, x2, y2, x, y) { + this.addShape(Shapes.cubicBezier( + this.lastX, this.lastY, + this.lastX + x1, this.lastY + y1, + this.lastX + x2, this.lastY + y2, + this.lastX + x, this.lastY + y + )); + + this.lastX += x; + this.lastY += y; + this.lastCommand = "c"; + } -/** - * curvetoQuadraticSmoothAbs - T - * - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.curvetoQuadraticSmoothAbs = function(x, y) { - let controlX, controlY; + /** + * linetoHorizontalAbs - H + * + * @param {number} x + */ + linetoHorizontalAbs(x) { + this.addShape(Shapes.line( + this.lastX, this.lastY, + x, this.lastY + )); + + this.lastX = x; + this.lastCommand = "H"; + } - if (this.lastCommand.match(/^[QqTt]$/)) { - const secondToLast = this.shapes[this.shapes.length - 1].args[1]; + /** + * linetoHorizontalRel - h + * + * @param {number} x + */ + linetoHorizontalRel(x) { + this.addShape(Shapes.line( + this.lastX, this.lastY, + this.lastX + x, this.lastY + )); + + this.lastX += x; + this.lastCommand = "h"; + } - controlX = 2 * this.lastX - secondToLast.x; - controlY = 2 * this.lastY - secondToLast.y; + /** + * linetoAbs - L + * + * @param {number} x + * @param {number} y + */ + linetoAbs(x, y) { + this.addShape(Shapes.line( + this.lastX, this.lastY, + x, y + )); + + this.lastX = x; + this.lastY = y; + this.lastCommand = "L"; } - else { - controlX = this.lastX; - controlY = this.lastY; + + /** + * linetoRel - l + * + * @param {number} x + * @param {number} y + */ + linetoRel(x, y) { + this.addShape(Shapes.line( + this.lastX, this.lastY, + this.lastX + x, this.lastY + y + )); + + this.lastX += x; + this.lastY += y; + this.lastCommand = "l"; } - this.addShape(Shapes.quadraticBezier( - controlX, controlY, - x, y - )); + /** + * movetoAbs - M + * + * @param {number} x + * @param {number} y + */ + movetoAbs(x, y) { + this.firstX = x; + this.firstY = y; + this.lastX = x; + this.lastY = y; + this.lastCommand = "M"; + } - this.lastX = x; - this.lastY = y; - this.lastCommand = "T"; -}; + /** + * movetoRel - m + * + * @param {number} x + * @param {number} y + */ + movetoRel(x, y) { + this.firstX += x; + this.firstY += y; + this.lastX += x; + this.lastY += y; + this.lastCommand = "m"; + } -/** - * curvetoQuadraticSmoothRel - t - * - * @param {number} x - * @param {number} y - */ -PathHandler.prototype.curvetoQuadraticSmoothRel = function(x, y) { - let controlX, controlY; + /** + * curvetoQuadraticAbs - Q + * + * @param {number} x1 + * @param {number} y1 + * @param {number} x + * @param {number} y + */ + curvetoQuadraticAbs(x1, y1, x, y) { + this.addShape(Shapes.quadraticBezier( + this.lastX, this.lastY, + x1, y1, + x, y + )); + + this.lastX = x; + this.lastY = y; + this.lastCommand = "Q"; + } - if (this.lastCommand.match(/^[QqTt]$/)) { - const secondToLast = this.shapes[this.shapes.length - 1].args[1]; + /** + * curvetoQuadraticRel - q + * + * @param {number} x1 + * @param {number} y1 + * @param {number} x + * @param {number} y + */ + curvetoQuadraticRel(x1, y1, x, y) { + this.addShape(Shapes.quadraticBezier( + this.lastX, this.lastY, + this.lastX + x1, this.lastY + y1, + this.lastX + x, this.lastY + y + )); + + this.lastX += x; + this.lastY += y; + this.lastCommand = "q"; + } - controlX = 2 * this.lastX - secondToLast.x; - controlY = 2 * this.lastY - secondToLast.y; + /** + * curvetoCubicSmoothAbs - S + * + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + */ + curvetoCubicSmoothAbs(x2, y2, x, y) { + let controlX, controlY; + + if (this.lastCommand.match(/^[SsCc]$/)) { + const secondToLast = this.shapes[this.shapes.length - 1].args[2]; + + controlX = 2 * this.lastX - secondToLast.x; + controlY = 2 * this.lastX - secondToLast.y; + } + else { + controlX = this.lastX; + controlY = this.lastY; + } + + this.addShape(Shapes.cubicBezier( + controlX, controlY, + x2, y2, + x, y + )); + + this.lastX = x; + this.lastY = y; + this.lastCommand = "S"; } - else { - controlX = this.lastX; - controlY = this.lastY; + + /** + * curvetoCubicSmoothRel - s + * + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + */ + curvetoCubicSmoothRel(x2, y2, x, y) { + let controlX, controlY; + + if (this.lastCommand.match(/^[SsCc]$/)) { + const secondToLast = this.shapes[this.shapes.length - 1].args[2]; + + controlX = 2 * this.lastX - secondToLast.x; + controlY = 2 * this.lastY - secondToLast.y; + } + else { + controlX = this.lastX; + controlY = this.lastY; + } + + this.addShape(Shapes.cubicBezier( + controlX, controlY, + this.lastX + x2, this.lastY + y2, + this.lastX + x, this.lastY + y + )); + + this.lastX += x; + this.lastY += y; + this.lastCommand = "s"; } - this.addShape(Shapes.quadraticBezier( - controlX, controlY, - this.lastX + x, this.lastY + y - )); + /** + * curvetoQuadraticSmoothAbs - T + * + * @param {number} x + * @param {number} y + */ + curvetoQuadraticSmoothAbs(x, y) { + let controlX, controlY; + + if (this.lastCommand.match(/^[QqTt]$/)) { + const secondToLast = this.shapes[this.shapes.length - 1].args[1]; + + controlX = 2 * this.lastX - secondToLast.x; + controlY = 2 * this.lastY - secondToLast.y; + } + else { + controlX = this.lastX; + controlY = this.lastY; + } + + this.addShape(Shapes.quadraticBezier( + controlX, controlY, + x, y + )); + + this.lastX = x; + this.lastY = y; + this.lastCommand = "T"; + } - this.lastX += x; - this.lastY += y; - this.lastCommand = "t"; -}; + /** + * curvetoQuadraticSmoothRel - t + * + * @param {number} x + * @param {number} y + */ + curvetoQuadraticSmoothRel(x, y) { + let controlX, controlY; + + if (this.lastCommand.match(/^[QqTt]$/)) { + const secondToLast = this.shapes[this.shapes.length - 1].args[1]; + + controlX = 2 * this.lastX - secondToLast.x; + controlY = 2 * this.lastY - secondToLast.y; + } + else { + controlX = this.lastX; + controlY = this.lastY; + } + + this.addShape(Shapes.quadraticBezier( + controlX, controlY, + this.lastX + x, this.lastY + y + )); + + this.lastX += x; + this.lastY += y; + this.lastCommand = "t"; + } -/** - * linetoVerticalAbs - V - * - * @param {number} y - */ -PathHandler.prototype.linetoVerticalAbs = function(y) { - this.addShape(Shapes.line( - this.lastX, this.lastY, - this.lastX, y - )); + /** + * linetoVerticalAbs - V + * + * @param {number} y + */ + linetoVerticalAbs(y) { + this.addShape(Shapes.line( + this.lastX, this.lastY, + this.lastX, y + )); - this.lastY = y; + this.lastY = y; - this.lastCommand = "V"; -}; + this.lastCommand = "V"; + } -/** - * linetoVerticalRel - v - * - * @param {number} y - */ -PathHandler.prototype.linetoVerticalRel = function(y) { - this.addShape(Shapes.line( - this.lastX, this.lastY, - this.lastX, this.lastY + y - )); + /** + * linetoVerticalRel - v + * + * @param {number} y + */ + linetoVerticalRel(y) { + this.addShape(Shapes.line( + this.lastX, this.lastY, + this.lastX, this.lastY + y + )); - this.lastY += y; + this.lastY += y; - this.lastCommand = "v"; -}; + this.lastCommand = "v"; + } -/** - * closePath - z or Z - */ -PathHandler.prototype.closePath = function() { - this.addShape(Shapes.line( - this.lastX, this.lastY, - this.firstX, this.firstY - )); - - this.lastX = this.firstX; - this.lastY = this.firstY; - this.lastCommand = "z"; -}; + /** + * closePath - z or Z + */ + closePath() { + this.addShape(Shapes.line( + this.lastX, this.lastY, + this.firstX, this.firstY + )); + + this.lastX = this.firstX; + this.lastY = this.firstY; + this.lastCommand = "z"; + } +} export default PathHandler; diff --git a/lib/Intersection.js b/lib/Intersection.js index e5c259c..a11db67 100644 --- a/lib/Intersection.js +++ b/lib/Intersection.js @@ -36,45 +36,47 @@ function closePolygon(points) { /** * Intersection - * @class - * @param {string} status */ -function Intersection(status) { - this.init(status); -} +class Intersection { + /** + * @param {string} status + */ + constructor(status) { + this.init(status); + } -/** - * init - * - * @param {string} status - * @returns {Intersection} - */ -Intersection.prototype.init = function(status) { - this.status = status; - this.points = []; -}; + /** + * init + * + * @param {string} status + * @returns {Intersection} + */ + init(status) { + this.status = status; + this.points = []; + } -/** - * appendPoint - * - * @param {Point2D} point - */ -Intersection.prototype.appendPoint = function(point) { - this.points.push(point); -}; - + /** + * appendPoint + * + * @param {Point2D} point + */ + appendPoint(point) { + this.points.push(point); + } -/** - * appendPoints - * - * @param {Array} points - */ -Intersection.prototype.appendPoints = function(points) { - this.points = this.points.concat(points); -}; + /** + * appendPoints + * + * @param {Array} points + */ + appendPoints(points) { + this.points = this.points.concat(points); + } +} // static methods diff --git a/lib/IntersectionArgs.js b/lib/IntersectionArgs.js index 93d713b..13368db 100644 --- a/lib/IntersectionArgs.js +++ b/lib/IntersectionArgs.js @@ -9,23 +9,26 @@ /** * IntersectionArgs * - * @param {string} name - * @param {Array} args - * @returns {IntersectionArgs} */ -function IntersectionArgs(name, args) { - this.init(name, args); +class IntersectionArgs { + /** + * @param {string} name + * @param {Array} args + * @returns {IntersectionArgs} + */ + constructor(name, args) { + this.init(name, args); + } + /** + * init + * + * @param {string} name + * @param {Array} args + */ + init(name, args) { + this.name = name; + this.args = args; + } } -/** - * init - * - * @param {string} name - * @param {Array} args - */ -IntersectionArgs.prototype.init = function(name, args) { - this.name = name; - this.args = args; -}; - export default IntersectionArgs; From b6bd40e291b345e537af15e13f91068475ee242f Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Sun, 5 May 2019 10:30:49 +0800 Subject: [PATCH 3/3] - Docs: Use jsdoc modules --- dist/index-esm.js | 510 ++++++++++++++++++++------------------ dist/index-esm.min.js.map | 2 +- dist/index-umd.js | 510 ++++++++++++++++++++------------------ dist/index-umd.min.js.map | 2 +- index.js | 61 ++++- lib/AffineShapes.js | 55 ++-- lib/Intersection.js | 389 ++++++++++++++--------------- lib/IntersectionArgs.js | 8 +- lib/IntersectionQuery.js | 26 +- lib/Shapes.js | 24 +- 10 files changed, 842 insertions(+), 745 deletions(-) diff --git a/dist/index-esm.js b/dist/index-esm.js index 74ba50f..99df64b 100644 --- a/dist/index-esm.js +++ b/dist/index-esm.js @@ -2021,7 +2021,7 @@ SqrtPolynomial.prototype.toString = function () { var Polynomial = Polynomial_1; /** - * + * @memberof module:kld-intersections.Intersection~ * @param {*} o * @returns {boolean} */ @@ -2031,9 +2031,9 @@ function isNullish(o) { } /** * closePolygon - * - * @param {Array} points - * @returns {Array} + * @memberof module:kld-intersections.Intersection~ + * @param {Array} points + * @returns {Array} */ @@ -2043,7 +2043,8 @@ function closePolygon(points) { return copy; } /** - * Intersection + * Intersection + * @memberof module:kld-intersections */ @@ -2052,6 +2053,7 @@ var Intersection = function () { /** * @param {string} status + * @returns {module:kld-intersections.Intersection} */ function Intersection(status) { _classCallCheck(this, Intersection); @@ -2062,7 +2064,7 @@ function () { * init * * @param {string} status - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2075,7 +2077,7 @@ function () { /** * appendPoint * - * @param {Point2D} point + * @param {module:kld-intersections.Point2D} point */ }, { @@ -2086,7 +2088,7 @@ function () { /** * appendPoints * - * @param {Array} points + * @param {Array} points */ }, { @@ -2102,9 +2104,9 @@ function () { /** * intersect * - * @param {IntersectionArgs} shape1 - * @param {IntersectionArgs} shape2 - * @returns {Intersection} + * @param {module:kld-intersections.IntersectionArgs} shape1 + * @param {module:kld-intersections.IntersectionArgs} shape2 + * @returns {module:kld-intersections.Intersection} */ @@ -2143,9 +2145,9 @@ Intersection.intersect = function (shape1, shape2) { /** * intersectPathShape * - * @param {IntersectionArgs} path - * @param {IntersectionArgs} shape - * @returns {Intersection} + * @param {module:kld-intersections.IntersectionArgs} path + * @param {module:kld-intersections.IntersectionArgs} shape + * @returns {module:kld-intersections.Intersection} */ @@ -2185,13 +2187,13 @@ Intersection.intersectPathShape = function (path, shape) { /** * intersectBezier2Bezier2 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @returns {module:kld-intersections.Intersection} */ @@ -2297,14 +2299,14 @@ Intersection.intersectBezier2Bezier2 = function (a1, a2, a3, b1, b2, b3) { /** * intersectBezier2Bezier3 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @param {module:kld-intersections.Point2D} b4 + * @returns {module:kld-intersections.Intersection} */ @@ -2417,12 +2419,12 @@ Intersection.intersectBezier2Bezier3 = function (a1, a2, a3, b1, b2, b3, b4) { /** * intersectBezier2Circle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2432,13 +2434,13 @@ Intersection.intersectBezier2Circle = function (p1, p2, p3, c, r) { /** * intersectBezier2Ellipse * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2492,12 +2494,12 @@ Intersection.intersectBezier2Ellipse = function (p1, p2, p3, ec, rx, ry) { /** * intersectBezier2Line * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -2582,11 +2584,11 @@ Intersection.intersectBezier2Line = function (p1, p2, p3, a1, a2) { /** * intersectBezier2Polygon * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -2596,11 +2598,11 @@ Intersection.intersectBezier2Polygon = function (p1, p2, p3, points) { /** * intersectBezier2Polyline * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -2624,12 +2626,12 @@ Intersection.intersectBezier2Polyline = function (p1, p2, p3, points) { /** * intersectBezier2Rectangle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -2657,15 +2659,15 @@ Intersection.intersectBezier2Rectangle = function (p1, p2, p3, r1, r2) { /** * intersectBezier3Bezier3 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} a4 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} a4 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @param {module:kld-intersections.Point2D} b4 + * @returns {module:kld-intersections.Intersection} */ @@ -2811,13 +2813,13 @@ Intersection.intersectBezier3Bezier3 = function (a1, a2, a3, a4, b1, b2, b3, b4) /** * intersectBezier3Circle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2827,14 +2829,14 @@ Intersection.intersectBezier3Circle = function (p1, p2, p3, p4, c, r) { /** * intersectBezier3Ellipse * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2900,13 +2902,13 @@ Intersection.intersectBezier3Ellipse = function (p1, p2, p3, p4, ec, rx, ry) { * sketch of the algorithm used here. Without his help, I'm not sure when I * would have figured out this intersection problem. * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -3013,12 +3015,12 @@ Intersection.intersectBezier3Line = function (p1, p2, p3, p4, a1, a2) { /** * intersectBezier3Polygon * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3028,12 +3030,12 @@ Intersection.intersectBezier3Polygon = function (p1, p2, p3, p4, points) { /** * intersectBezier3Polyline * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3057,13 +3059,13 @@ Intersection.intersectBezier3Polyline = function (p1, p2, p3, p4, points) { /** * intersectBezier3Rectangle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3091,11 +3093,11 @@ Intersection.intersectBezier3Rectangle = function (p1, p2, p3, p4, r1, r2) { /** * intersectCircleCircle * - * @param {Point2D} c1 + * @param {module:kld-intersections.Point2D} c1 * @param {number} r1 - * @param {Point2D} c2 + * @param {module:kld-intersections.Point2D} c2 * @param {number} r2 - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -3126,12 +3128,12 @@ Intersection.intersectCircleCircle = function (c1, r1, c2, r2) { /** * intersectCircleEllipse * - * @param {Point2D} cc + * @param {module:kld-intersections.Point2D} cc * @param {number} r - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -3141,11 +3143,11 @@ Intersection.intersectCircleEllipse = function (cc, r, ec, rx, ry) { /** * intersectCircleLine * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -3189,10 +3191,10 @@ Intersection.intersectCircleLine = function (c, r, a1, a2) { /** * intersectCirclePolygon * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3202,10 +3204,10 @@ Intersection.intersectCirclePolygon = function (c, r, points) { /** * intersectCirclePolyline * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3232,11 +3234,11 @@ Intersection.intersectCirclePolyline = function (c, r, points) { /** * intersectCircleRectangle * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3272,13 +3274,13 @@ Intersection.intersectCircleRectangle = function (c, r, r1, r2) { * * NOTE: Rotation will need to be added to this function * - * @param {Point2D} c1 + * @param {module:kld-intersections.Point2D} c1 * @param {number} rx1 * @param {number} ry1 - * @param {Point2D} c2 + * @param {module:kld-intersections.Point2D} c2 * @param {number} rx2 * @param {number} ry2 - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -3320,12 +3322,12 @@ Intersection.intersectEllipseEllipse = function (c1, rx1, ry1, c2, rx2, ry2) { * * NOTE: Rotation will need to be added to this function * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -3383,11 +3385,11 @@ Intersection.intersectEllipseLine = function (c, rx, ry, a1, a2) { /** * intersectEllipsePolygon * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3397,11 +3399,11 @@ Intersection.intersectEllipsePolygon = function (c, rx, ry, points) { /** * intersectEllipsePolyline * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3425,12 +3427,12 @@ Intersection.intersectEllipsePolyline = function (c, rx, ry, points) { /** * intersectEllipseRectangle * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3458,11 +3460,11 @@ Intersection.intersectEllipseRectangle = function (c, rx, ry, r1, r2) { /** * intersectLineLine * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ @@ -3493,10 +3495,10 @@ Intersection.intersectLineLine = function (a1, a2, b1, b2) { /** * intersectLinePolygon * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3506,10 +3508,10 @@ Intersection.intersectLinePolygon = function (a1, a2, points) { /** * intersectLinePolyline * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3533,11 +3535,11 @@ Intersection.intersectLinePolyline = function (a1, a2, points) { /** * intersectLineRectangle * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3565,9 +3567,9 @@ Intersection.intersectLineRectangle = function (a1, a2, r1, r2) { /** * intersectPolygonPolygon * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ @@ -3577,9 +3579,9 @@ Intersection.intersectPolygonPolygon = function (points1, points2) { /** * intersectPolygonPolyline * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ @@ -3589,10 +3591,10 @@ Intersection.intersectPolygonPolyline = function (points1, points2) { /** * intersectPolygonRectangle * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {Array} points + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3602,9 +3604,9 @@ Intersection.intersectPolygonRectangle = function (points, r1, r2) { /** * intersectPolylinePolyline * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ @@ -3628,10 +3630,10 @@ Intersection.intersectPolylinePolyline = function (points1, points2) { /** * intersectPolylineRectangle * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {Array} points + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3659,11 +3661,11 @@ Intersection.intersectPolylineRectangle = function (points, r1, r2) { /** * intersectRectangleRectangle * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ @@ -3691,11 +3693,11 @@ Intersection.intersectRectangleRectangle = function (a1, a2, b1, b2) { /** * intersectRayRay * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ @@ -3724,9 +3726,9 @@ Intersection.intersectRayRay = function (a1, a2, b1, b2) { * code along with many other excellent examples are avaiable at his site: * http://www.magic-software.com * - * @param {Array} e1 - * @param {Array} e2 - * @returns {Polynomial} + * @param {Array} e1 + * @param {Array} e2 + * @returns {external:Polynomial} */ @@ -3757,15 +3759,15 @@ Intersection.bezout = function (e1, e2) { /** * IntersectionArgs - * + * @memberof module:kld-intersections */ var IntersectionArgs = /*#__PURE__*/ function () { /** * @param {string} name - * @param {Array} args - * @returns {IntersectionArgs} + * @param {Array} args + * @returns {module:kld-intersections.IntersectionArgs} */ function IntersectionArgs(name, args) { _classCallCheck(this, IntersectionArgs); @@ -3776,7 +3778,7 @@ function () { * init * * @param {string} name - * @param {Array} args + * @param {Array} args */ @@ -3795,7 +3797,12 @@ function () { * Shapes * * @copyright 2017, Kevin Lindsey + * @module Shapes + */ +/** + * @namespace */ + var Shapes = {}; /** * quadraticBezier @@ -3806,7 +3813,7 @@ var Shapes = {}; * @param {number} p2y * @param {number} p3x * @param {number} p3y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.quadraticBezier = function (p1x, p1y, p2x, p2y, p3x, p3y) { @@ -3823,7 +3830,7 @@ Shapes.quadraticBezier = function (p1x, p1y, p2x, p2y, p3x, p3y) { * @param {number} p3y * @param {number} p4x * @param {number} p4y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3836,7 +3843,7 @@ Shapes.cubicBezier = function (p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { * @param {number} centerX * @param {number} centerY * @param {number} radius - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3850,7 +3857,7 @@ Shapes.circle = function (centerX, centerY, radius) { * @param {number} centerY * @param {number} radiusX * @param {number} radiusY - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3864,7 +3871,7 @@ Shapes.ellipse = function (centerX, centerY, radiusX, radiusY) { * @param {number} p1y * @param {number} p2x * @param {number} p2y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3874,8 +3881,8 @@ Shapes.line = function (p1x, p1y, p2x, p2y) { /** * path * - * @param {Array} segments - * @returns {IntersectionArgs} + * @param {Array} segments + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3886,7 +3893,7 @@ Shapes.path = function (segments) { * polygon * * @param {Array} coords - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3903,7 +3910,7 @@ Shapes.polygon = function (coords) { * polyline * * @param {Array} coords - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3923,7 +3930,7 @@ Shapes.polyline = function (coords) { * @param {number} y * @param {number} width * @param {number} height - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3935,15 +3942,19 @@ Shapes.rectangle = function (x, y, width, height) { * AffineShapes * * @copyright 2017, Kevin Lindsey + * @module AffineShapes + */ +/** + * @namespace */ + var AffineShapes = {}; /** * quadraticBezier - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.quadraticBezier = function (p1, p2, p3) { @@ -3952,11 +3963,11 @@ AffineShapes.quadraticBezier = function (p1, p2, p3) { /** * cubicBezier * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3966,9 +3977,9 @@ AffineShapes.cubicBezier = function (p1, p2, p3, p4) { /** * circle * - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} center * @param {number} radius - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3978,10 +3989,10 @@ AffineShapes.circle = function (center, radius) { /** * ellipse * - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} center * @param {number} radiusX * @param {number} radiusY - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3991,9 +4002,9 @@ AffineShapes.ellipse = function (center, radiusX, radiusY) { /** * line * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4003,8 +4014,8 @@ AffineShapes.line = function (p1, p2) { /** * path * - * @param {Array} segments - * @returns {IntersectionArgs} + * @param {Array} segments + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4014,8 +4025,8 @@ AffineShapes.path = function (segments) { /** * polygon * - * @param {Array} points - * @returns {IntersectionArgs} + * @param {Array} points + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4025,8 +4036,8 @@ AffineShapes.polygon = function (points) { /** * polyline * - * @param {Array} points - * @returns {IntersectionArgs} + * @param {Array} points + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4036,9 +4047,9 @@ AffineShapes.polyline = function (points) { /** * rectangle * - * @param {Point2D} topLeft - * @param {Vector2D} size - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} topLeft + * @param {module:kld-intersections.Vector2D} size + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4051,18 +4062,18 @@ AffineShapes.rectangle = function (topLeft, size) { * IntersectionQuery.js * * @copyright 2017 Kevin Lindsey - * + * @module IntersectionQuery */ /** - * + * @namespace */ var IntersectionQuery = {}; /** * pointInCircle * - * @param {Point2D} point - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} center * @param {number} radius * @returns {boolean} */ @@ -4074,8 +4085,8 @@ IntersectionQuery.pointInCircle = function (point, center, radius) { /** * pointInEllipse * - * @param {Point2D} point - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} center * @param {number} radiusX * @param {number} radiusY * @returns {boolean} @@ -4089,8 +4100,8 @@ IntersectionQuery.pointInEllipse = function (point, center, radiusX, radiusY) { /** * pointInPolyline * - * @param {Point2D} point - * @param {Array} points + * @param {module:kld-intersections.Point2D} point + * @param {Array} points */ @@ -4122,8 +4133,8 @@ IntersectionQuery.pointInPolyline = function (point, points) { /** * pointInPolyline * - * @param {Point2D} point - * @param {Array} points + * @param {module:kld-intersections.Point2D} point + * @param {Array} points */ @@ -4131,9 +4142,9 @@ IntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline; /** * pointInRectangle * - * @param {Point2D} point - * @param {Point2D} topLeft - * @param {Point2D} bottomRight + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} topLeft + * @param {module:kld-intersections.Point2D} bottomRight * @returns {boolean} */ @@ -4141,6 +4152,11 @@ IntersectionQuery.pointInRectangle = function (point, topLeft, bottomRight) { return topLeft.x <= point.x && point.x < bottomRight.x && topLeft.y <= point.y && point.y < bottomRight.y; }; -// expose module classes +/** + * @module kld-intersections + */ +/** +* @external Polynomial +*/ export { AffineShapes, Intersection, IntersectionArgs, IntersectionQuery, Matrix2D, Point2D, Shapes, Vector2D }; diff --git a/dist/index-esm.min.js.map b/dist/index-esm.min.js.map index bb578e3..7458805 100644 --- a/dist/index-esm.min.js.map +++ b/dist/index-esm.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index-esm.min.js","sources":["../node_modules/kld-affine/lib/Point2D.js","../node_modules/kld-affine/lib/Vector2D.js","../node_modules/kld-affine/lib/Matrix2D.js","../node_modules/kld-affine/index.js","../node_modules/kld-polynomial/lib/Polynomial.js","../node_modules/kld-polynomial/lib/SqrtPolynomial.js","../node_modules/kld-polynomial/index.js","../lib/Intersection.js","../lib/IntersectionArgs.js","../lib/Shapes.js","../lib/AffineShapes.js","../lib/IntersectionQuery.js"],"sourcesContent":["/**\n *\n * Point2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Point2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Point2D}\n */\nfunction Point2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * clone\n *\n * @returns {Point2D}\n */\nPoint2D.prototype.clone = function() {\n return new this.constructor(this.x, this.y);\n};\n\n/**\n * add\n *\n * @param {Point2D|Vector2D} that\n * @returns {Point2D}\n */\nPoint2D.prototype.add = function(that) {\n return new this.constructor(this.x+that.x, this.y+that.y);\n};\n\n/**\n * subtract\n *\n * @param { Vector2D | Point2D } that\n * @returns {Point2D}\n */\nPoint2D.prototype.subtract = function(that) {\n return new this.constructor(this.x-that.x, this.y-that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x*scalar, this.y*scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x/scalar, this.y/scalar);\n};\n\n/**\n * equals\n *\n * @param {Point2D} that\n * @returns {Boolean}\n */\nPoint2D.prototype.equals = function(that) {\n return ( this.x === that.x && this.y === that.y );\n};\n\n/**\n * precisionEquals\n *\n * @param {Point2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nPoint2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n// utility methods\n\n/**\n * lerp\n *\n * @param { Vector2D | Point2D } that\n * @param {Number} t\n @ @returns {Point2D}\n */\nPoint2D.prototype.lerp = function(that, t) {\n var omt = 1.0 - t;\n\n return new this.constructor(\n this.x * omt + that.x * t,\n this.y * omt + that.y * t\n );\n};\n\n/**\n * distanceFrom\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.distanceFrom = function(that) {\n var dx = this.x - that.x;\n var dy = this.y - that.y;\n\n return Math.sqrt(dx*dx + dy*dy);\n};\n\n/**\n * min\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.min = function(that) {\n return new this.constructor(\n Math.min( this.x, that.x ),\n Math.min( this.y, that.y )\n );\n};\n\n/**\n * max\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.max = function(that) {\n return new this.constructor(\n Math.max( this.x, that.x ),\n Math.max( this.y, that.y )\n );\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @result {Point2D}\n */\nPoint2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y + matrix.e,\n matrix.b * this.x + matrix.d * this.y + matrix.f\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nPoint2D.prototype.toString = function() {\n return \"point(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Point2D;\n}\n","/**\n *\n * Vector2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Vector2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Vector2D}\n */\nfunction Vector2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * fromPoints\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {Vector2D}\n */\nVector2D.fromPoints = function(p1, p2) {\n return new Vector2D(\n p2.x - p1.x,\n p2.y - p1.y\n );\n};\n\n/**\n * length\n *\n * @returns {Number}\n */\nVector2D.prototype.length = function() {\n return Math.sqrt(this.x*this.x + this.y*this.y);\n};\n\n/**\n * magnitude\n *\n * @returns {Number}\n */\nVector2D.prototype.magnitude = function() {\n return this.x*this.x + this.y*this.y;\n};\n\n/**\n * dot\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.dot = function(that) {\n return this.x*that.x + this.y*that.y;\n};\n\n/**\n * cross\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.cross = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * determinant\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.determinant = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * unit\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.unit = function() {\n return this.divide( this.length() );\n};\n\n/**\n * add\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.add = function(that) {\n return new this.constructor(this.x + that.x, this.y + that.y);\n};\n\n/**\n * subtract\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.subtract = function(that) {\n return new this.constructor(this.x - that.x, this.y - that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x * scalar, this.y * scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x / scalar, this.y / scalar);\n};\n\n/**\n * angleBetween\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.angleBetween = function(that) {\n var cos = this.dot(that) / (this.length() * that.length());\n cos = Math.max(-1, Math.min(cos, 1));\n var radians = Math.acos(cos);\n\n return (this.cross(that) < 0.0) ? -radians : radians;\n};\n\n/**\n * Find a vector is that is perpendicular to this vector\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.perp = function() {\n return new this.constructor(-this.y, this.x);\n};\n\n/**\n * Find the component of the specified vector that is perpendicular to\n * this vector\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.perpendicular = function(that) {\n return this.subtract(this.project(that));\n};\n\n/**\n * project\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.project = function(that) {\n var percent = this.dot(that) / that.dot(that);\n\n return that.multiply(percent);\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @returns {Vector2D}\n */\nVector2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y,\n matrix.b * this.x + matrix.d * this.y\n );\n};\n\n/**\n * equals\n *\n * @param {Vector2D} that\n * @returns {Boolean}\n */\nVector2D.prototype.equals = function(that) {\n return (\n this.x === that.x &&\n this.y === that.y\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Vector2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nVector2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nVector2D.prototype.toString = function() {\n return \"vector(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Vector2D;\n}\n","/**\n * Matrix2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n */\n\nfunction setReadonlyProperty(object, property, value) {\n Object.defineProperty(object, property, {\n value: value,\n writable: false,\n enumerable: true,\n configurable: false\n });\n}\n\n/**\n * Identity matrix\n *\n * @returns {Matrix2D}\n */\nsetReadonlyProperty(Matrix2D, \"IDENTITY\", new Matrix2D(1, 0, 0, 1, 0, 0));\nsetReadonlyProperty(Matrix2D.IDENTITY, \"isIdentity\", function () { return true; });\n\n\n/**\n * Matrix2D\n *\n * [a c e]\n * [b d f]\n * [0 0 1]\n *\n * @param {Number} a\n * @param {Number} b\n * @param {Number} c\n * @param {Number} d\n * @param {Number} e\n * @param {Number} f\n * @returns {Matrix2D}\n */\nfunction Matrix2D(a, b, c, d, e, f) {\n setReadonlyProperty(this, \"a\", (a !== undefined) ? a : 1);\n setReadonlyProperty(this, \"b\", (b !== undefined) ? b : 0);\n setReadonlyProperty(this, \"c\", (c !== undefined) ? c : 0);\n setReadonlyProperty(this, \"d\", (d !== undefined) ? d : 1);\n setReadonlyProperty(this, \"e\", (e !== undefined) ? e : 0);\n setReadonlyProperty(this, \"f\", (f !== undefined) ? f : 0);\n}\n\n\n// *** STATIC METHODS\n\n/**\n * translation\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.translation = function(tx, ty) {\n return new Matrix2D(1, 0, 0, 1, tx, ty);\n};\n\n/**\n * scaling\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.scaling = function(scale) {\n return new Matrix2D(scale, 0, 0, scale, 0, 0);\n};\n\n/**\n * scalingAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.scalingAt = function(scale, center) {\n return new Matrix2D(\n scale,\n 0,\n 0,\n scale,\n center.x - center.x * scale,\n center.y - center.y * scale\n );\n}\n\n\n/**\n * nonUniformScaling\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScaling = function(scaleX, scaleY) {\n return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0);\n};\n\n/**\n * nonUniformScalingAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScalingAt = function(scaleX, scaleY, center) {\n return new Matrix2D(\n scaleX,\n 0,\n 0,\n scaleY,\n center.x - center.x * scaleX,\n center.y - center.y * scaleY\n );\n};\n\n/**\n * rotation\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.rotation = function(radians) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * rotationAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.rotationAt = function(radians, center) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(\n c,\n s,\n -s,\n c,\n center.x - center.x * c + center.y * s,\n center.y - center.y * c - center.x * s\n );\n};\n\n/**\n * rotationFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.rotationFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * xFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.xFlip = function() {\n return new Matrix2D(-1, 0, 0, 1, 0, 0);\n};\n\n/**\n * yFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.yFlip = function() {\n return new Matrix2D(1, 0, 0, -1, 0, 0);\n};\n\n/**\n * xSkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.xSkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, 0, t, 1, 0, 0);\n};\n\n/**\n * ySkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.ySkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, t, 0, 1, 0, 0);\n};\n\n\n// *** METHODS\n\n/**\n * multiply\n *\n * @pararm {Matrix2D} that\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.multiply = function (that) {\n if (this.isIdentity()) {\n return that;\n }\n\n if (that.isIdentity()) {\n return this;\n }\n\n return new this.constructor(\n this.a * that.a + this.c * that.b,\n this.b * that.a + this.d * that.b,\n this.a * that.c + this.c * that.d,\n this.b * that.c + this.d * that.d,\n this.a * that.e + this.c * that.f + this.e,\n this.b * that.e + this.d * that.f + this.f\n );\n};\n\n/**\n * inverse\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.inverse = function () {\n if (this.isIdentity()) {\n return this;\n }\n\n var det1 = this.a * this.d - this.b * this.c;\n\n if ( det1 === 0.0 ) {\n throw(\"Matrix is not invertible\");\n }\n\n var idet = 1.0 / det1;\n var det2 = this.f * this.c - this.e * this.d;\n var det3 = this.e * this.b - this.f * this.a;\n\n return new this.constructor(\n this.d * idet,\n -this.b * idet,\n -this.c * idet,\n this.a * idet,\n det2 * idet,\n det3 * idet\n );\n};\n\n/**\n * translate\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.translate = function(tx, ty) {\n return new this.constructor(\n this.a,\n this.b,\n this.c,\n this.d,\n this.a * tx + this.c * ty + this.e,\n this.b * tx + this.d * ty + this.f\n );\n};\n\n/**\n * scale\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scale = function(scale) {\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleAt = function(scale, center) {\n var dx = center.x - scale * center.x;\n var dy = center.y - scale * center.y;\n\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * scaleNonUniform\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniform = function(scaleX, scaleY) {\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleNonUniformAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniformAt = function(scaleX, scaleY, center) {\n var dx = center.x - scaleX * center.x;\n var dy = center.y - scaleY * center.y;\n\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * rotate\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotate = function(radians) {\n var c = Math.cos(radians);\n var s = Math.sin(radians);\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * rotateAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @result {Matrix2D}\n */\nMatrix2D.prototype.rotateAt = function(radians, center) {\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var cx = center.x;\n var cy = center.y;\n\n var a = this.a * cos + this.c * sin;\n var b = this.b * cos + this.d * sin;\n var c = this.c * cos - this.a * sin;\n var d = this.d * cos - this.b * sin;\n\n return new this.constructor(\n a,\n b,\n c,\n d,\n (this.a - a) * cx + (this.c - c) * cy + this.e,\n (this.b - b) * cx + (this.d - d) * cy + this.f\n );\n};\n\n/**\n * rotateFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotateFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * flipX\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipX = function() {\n return new this.constructor(\n -this.a,\n -this.b,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * flipY\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipY = function() {\n return new this.constructor(\n this.a,\n this.b,\n -this.c,\n -this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * skewX\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewX = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a,\n this.b,\n this.c + this.a * t,\n this.d + this.b * t,\n this.e,\n this.f\n );\n};\n\n// TODO: skewXAt\n\n/**\n * skewY\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewY = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a + this.c * t,\n this.b + this.d * t,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n// TODO: skewYAt\n\n/**\n * isIdentity\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isIdentity = function() {\n return (\n this.a === 1.0 &&\n this.b === 0.0 &&\n this.c === 0.0 &&\n this.d === 1.0 &&\n this.e === 0.0 &&\n this.f === 0.0\n );\n};\n\n/**\n * isInvertible\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isInvertible = function() {\n return this.a * this.d - this.b * this.c !== 0.0;\n};\n\n/**\n * getScale\n *\n * @returns {{ scaleX: Number, scaleY: Number }}\n */\nMatrix2D.prototype.getScale = function() {\n return {\n scaleX: Math.sqrt(this.a * this.a + this.c * this.c),\n scaleY: Math.sqrt(this.b * this.b + this.d * this.d)\n };\n};\n\n/**\n * getDecomposition\n *\n * Calculates matrix Singular Value Decomposition\n *\n * The resulting matrices, translation, rotation, scale, and rotation0, return\n * this matrix when they are muliplied together in the listed order\n *\n * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688}\n * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation}\n *\n * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }}\n */\nMatrix2D.prototype.getDecomposition = function () {\n var E = (this.a + this.d) * 0.5;\n var F = (this.a - this.d) * 0.5;\n var G = (this.b + this.c) * 0.5;\n var H = (this.b - this.c) * 0.5;\n\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n var scaleX = Q + R;\n var scaleY = Q - R;\n\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n var theta = (a2 - a1) * 0.5;\n var phi = (a2 + a1) * 0.5;\n\n // TODO: Add static methods to generate translation, rotation, etc.\n // matrices directly\n\n return {\n translation: new this.constructor(1, 0, 0, 1, this.e, this.f),\n rotation: this.constructor.IDENTITY.rotate(phi),\n scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0),\n rotation0: this.constructor.IDENTITY.rotate(theta)\n };\n};\n\n/**\n * equals\n *\n * @param {Matrix2D} that\n * @returns {Boolean}\n */\nMatrix2D.prototype.equals = function(that) {\n return (\n this.a === that.a &&\n this.b === that.b &&\n this.c === that.c &&\n this.d === that.d &&\n this.e === that.e &&\n this.f === that.f\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Matrix2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nMatrix2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.a - that.a) < precision &&\n Math.abs(this.b - that.b) < precision &&\n Math.abs(this.c - that.c) < precision &&\n Math.abs(this.d - that.d) < precision &&\n Math.abs(this.e - that.e) < precision &&\n Math.abs(this.f - that.f) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nMatrix2D.prototype.toString = function() {\n return \"matrix(\" + [this.a, this.b, this.c, this.d, this.e, this.f].join(\",\") + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Matrix2D;\n}\n","// expose classes\n\nexports.Point2D = require('./lib/Point2D');\nexports.Vector2D = require('./lib/Vector2D');\nexports.Matrix2D = require('./lib/Matrix2D');\n","/**\n *\n * Polynomial.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n * \n * contribution {@link http://github.com/Quazistax/kld-polynomial}\n * @copyright 2015 Robert Benko (Quazistax) \n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n */\nclass Intersection {\n /**\n * @param {string} status\n */\n constructor(status) {\n this.init(status);\n }\n\n\n /**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\n init(status) {\n this.status = status;\n this.points = [];\n }\n\n\n /**\n * appendPoint\n *\n * @param {Point2D} point\n */\n appendPoint(point) {\n this.points.push(point);\n }\n\n\n /**\n * appendPoints\n *\n * @param {Array} points\n */\n appendPoints(points) {\n this.points = this.points.concat(points);\n }\n}\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n */\nclass IntersectionArgs {\n /**\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\n constructor(name, args) {\n this.init(name, args);\n }\n /**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\n init(name, args) {\n this.name = name;\n this.args = args;\n }\n}\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","point","intersect","shape1","shape2","name","intersectPathShape","method","args","apply","path","shape","segment","inter","appendPoints","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","appendPoint","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","IntersectionArgs","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-esm.min.js","sources":["../node_modules/kld-affine/lib/Point2D.js","../node_modules/kld-affine/lib/Vector2D.js","../node_modules/kld-affine/lib/Matrix2D.js","../node_modules/kld-affine/index.js","../node_modules/kld-polynomial/lib/Polynomial.js","../node_modules/kld-polynomial/lib/SqrtPolynomial.js","../node_modules/kld-polynomial/index.js","../lib/Intersection.js","../lib/IntersectionArgs.js","../lib/Shapes.js","../lib/AffineShapes.js","../lib/IntersectionQuery.js"],"sourcesContent":["/**\n *\n * Point2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Point2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Point2D}\n */\nfunction Point2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * clone\n *\n * @returns {Point2D}\n */\nPoint2D.prototype.clone = function() {\n return new this.constructor(this.x, this.y);\n};\n\n/**\n * add\n *\n * @param {Point2D|Vector2D} that\n * @returns {Point2D}\n */\nPoint2D.prototype.add = function(that) {\n return new this.constructor(this.x+that.x, this.y+that.y);\n};\n\n/**\n * subtract\n *\n * @param { Vector2D | Point2D } that\n * @returns {Point2D}\n */\nPoint2D.prototype.subtract = function(that) {\n return new this.constructor(this.x-that.x, this.y-that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x*scalar, this.y*scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x/scalar, this.y/scalar);\n};\n\n/**\n * equals\n *\n * @param {Point2D} that\n * @returns {Boolean}\n */\nPoint2D.prototype.equals = function(that) {\n return ( this.x === that.x && this.y === that.y );\n};\n\n/**\n * precisionEquals\n *\n * @param {Point2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nPoint2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n// utility methods\n\n/**\n * lerp\n *\n * @param { Vector2D | Point2D } that\n * @param {Number} t\n @ @returns {Point2D}\n */\nPoint2D.prototype.lerp = function(that, t) {\n var omt = 1.0 - t;\n\n return new this.constructor(\n this.x * omt + that.x * t,\n this.y * omt + that.y * t\n );\n};\n\n/**\n * distanceFrom\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.distanceFrom = function(that) {\n var dx = this.x - that.x;\n var dy = this.y - that.y;\n\n return Math.sqrt(dx*dx + dy*dy);\n};\n\n/**\n * min\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.min = function(that) {\n return new this.constructor(\n Math.min( this.x, that.x ),\n Math.min( this.y, that.y )\n );\n};\n\n/**\n * max\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.max = function(that) {\n return new this.constructor(\n Math.max( this.x, that.x ),\n Math.max( this.y, that.y )\n );\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @result {Point2D}\n */\nPoint2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y + matrix.e,\n matrix.b * this.x + matrix.d * this.y + matrix.f\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nPoint2D.prototype.toString = function() {\n return \"point(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Point2D;\n}\n","/**\n *\n * Vector2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Vector2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Vector2D}\n */\nfunction Vector2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * fromPoints\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {Vector2D}\n */\nVector2D.fromPoints = function(p1, p2) {\n return new Vector2D(\n p2.x - p1.x,\n p2.y - p1.y\n );\n};\n\n/**\n * length\n *\n * @returns {Number}\n */\nVector2D.prototype.length = function() {\n return Math.sqrt(this.x*this.x + this.y*this.y);\n};\n\n/**\n * magnitude\n *\n * @returns {Number}\n */\nVector2D.prototype.magnitude = function() {\n return this.x*this.x + this.y*this.y;\n};\n\n/**\n * dot\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.dot = function(that) {\n return this.x*that.x + this.y*that.y;\n};\n\n/**\n * cross\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.cross = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * determinant\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.determinant = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * unit\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.unit = function() {\n return this.divide( this.length() );\n};\n\n/**\n * add\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.add = function(that) {\n return new this.constructor(this.x + that.x, this.y + that.y);\n};\n\n/**\n * subtract\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.subtract = function(that) {\n return new this.constructor(this.x - that.x, this.y - that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x * scalar, this.y * scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x / scalar, this.y / scalar);\n};\n\n/**\n * angleBetween\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.angleBetween = function(that) {\n var cos = this.dot(that) / (this.length() * that.length());\n cos = Math.max(-1, Math.min(cos, 1));\n var radians = Math.acos(cos);\n\n return (this.cross(that) < 0.0) ? -radians : radians;\n};\n\n/**\n * Find a vector is that is perpendicular to this vector\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.perp = function() {\n return new this.constructor(-this.y, this.x);\n};\n\n/**\n * Find the component of the specified vector that is perpendicular to\n * this vector\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.perpendicular = function(that) {\n return this.subtract(this.project(that));\n};\n\n/**\n * project\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.project = function(that) {\n var percent = this.dot(that) / that.dot(that);\n\n return that.multiply(percent);\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @returns {Vector2D}\n */\nVector2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y,\n matrix.b * this.x + matrix.d * this.y\n );\n};\n\n/**\n * equals\n *\n * @param {Vector2D} that\n * @returns {Boolean}\n */\nVector2D.prototype.equals = function(that) {\n return (\n this.x === that.x &&\n this.y === that.y\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Vector2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nVector2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nVector2D.prototype.toString = function() {\n return \"vector(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Vector2D;\n}\n","/**\n * Matrix2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n */\n\nfunction setReadonlyProperty(object, property, value) {\n Object.defineProperty(object, property, {\n value: value,\n writable: false,\n enumerable: true,\n configurable: false\n });\n}\n\n/**\n * Identity matrix\n *\n * @returns {Matrix2D}\n */\nsetReadonlyProperty(Matrix2D, \"IDENTITY\", new Matrix2D(1, 0, 0, 1, 0, 0));\nsetReadonlyProperty(Matrix2D.IDENTITY, \"isIdentity\", function () { return true; });\n\n\n/**\n * Matrix2D\n *\n * [a c e]\n * [b d f]\n * [0 0 1]\n *\n * @param {Number} a\n * @param {Number} b\n * @param {Number} c\n * @param {Number} d\n * @param {Number} e\n * @param {Number} f\n * @returns {Matrix2D}\n */\nfunction Matrix2D(a, b, c, d, e, f) {\n setReadonlyProperty(this, \"a\", (a !== undefined) ? a : 1);\n setReadonlyProperty(this, \"b\", (b !== undefined) ? b : 0);\n setReadonlyProperty(this, \"c\", (c !== undefined) ? c : 0);\n setReadonlyProperty(this, \"d\", (d !== undefined) ? d : 1);\n setReadonlyProperty(this, \"e\", (e !== undefined) ? e : 0);\n setReadonlyProperty(this, \"f\", (f !== undefined) ? f : 0);\n}\n\n\n// *** STATIC METHODS\n\n/**\n * translation\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.translation = function(tx, ty) {\n return new Matrix2D(1, 0, 0, 1, tx, ty);\n};\n\n/**\n * scaling\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.scaling = function(scale) {\n return new Matrix2D(scale, 0, 0, scale, 0, 0);\n};\n\n/**\n * scalingAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.scalingAt = function(scale, center) {\n return new Matrix2D(\n scale,\n 0,\n 0,\n scale,\n center.x - center.x * scale,\n center.y - center.y * scale\n );\n}\n\n\n/**\n * nonUniformScaling\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScaling = function(scaleX, scaleY) {\n return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0);\n};\n\n/**\n * nonUniformScalingAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScalingAt = function(scaleX, scaleY, center) {\n return new Matrix2D(\n scaleX,\n 0,\n 0,\n scaleY,\n center.x - center.x * scaleX,\n center.y - center.y * scaleY\n );\n};\n\n/**\n * rotation\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.rotation = function(radians) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * rotationAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.rotationAt = function(radians, center) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(\n c,\n s,\n -s,\n c,\n center.x - center.x * c + center.y * s,\n center.y - center.y * c - center.x * s\n );\n};\n\n/**\n * rotationFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.rotationFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * xFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.xFlip = function() {\n return new Matrix2D(-1, 0, 0, 1, 0, 0);\n};\n\n/**\n * yFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.yFlip = function() {\n return new Matrix2D(1, 0, 0, -1, 0, 0);\n};\n\n/**\n * xSkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.xSkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, 0, t, 1, 0, 0);\n};\n\n/**\n * ySkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.ySkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, t, 0, 1, 0, 0);\n};\n\n\n// *** METHODS\n\n/**\n * multiply\n *\n * @pararm {Matrix2D} that\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.multiply = function (that) {\n if (this.isIdentity()) {\n return that;\n }\n\n if (that.isIdentity()) {\n return this;\n }\n\n return new this.constructor(\n this.a * that.a + this.c * that.b,\n this.b * that.a + this.d * that.b,\n this.a * that.c + this.c * that.d,\n this.b * that.c + this.d * that.d,\n this.a * that.e + this.c * that.f + this.e,\n this.b * that.e + this.d * that.f + this.f\n );\n};\n\n/**\n * inverse\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.inverse = function () {\n if (this.isIdentity()) {\n return this;\n }\n\n var det1 = this.a * this.d - this.b * this.c;\n\n if ( det1 === 0.0 ) {\n throw(\"Matrix is not invertible\");\n }\n\n var idet = 1.0 / det1;\n var det2 = this.f * this.c - this.e * this.d;\n var det3 = this.e * this.b - this.f * this.a;\n\n return new this.constructor(\n this.d * idet,\n -this.b * idet,\n -this.c * idet,\n this.a * idet,\n det2 * idet,\n det3 * idet\n );\n};\n\n/**\n * translate\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.translate = function(tx, ty) {\n return new this.constructor(\n this.a,\n this.b,\n this.c,\n this.d,\n this.a * tx + this.c * ty + this.e,\n this.b * tx + this.d * ty + this.f\n );\n};\n\n/**\n * scale\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scale = function(scale) {\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleAt = function(scale, center) {\n var dx = center.x - scale * center.x;\n var dy = center.y - scale * center.y;\n\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * scaleNonUniform\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniform = function(scaleX, scaleY) {\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleNonUniformAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniformAt = function(scaleX, scaleY, center) {\n var dx = center.x - scaleX * center.x;\n var dy = center.y - scaleY * center.y;\n\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * rotate\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotate = function(radians) {\n var c = Math.cos(radians);\n var s = Math.sin(radians);\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * rotateAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @result {Matrix2D}\n */\nMatrix2D.prototype.rotateAt = function(radians, center) {\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var cx = center.x;\n var cy = center.y;\n\n var a = this.a * cos + this.c * sin;\n var b = this.b * cos + this.d * sin;\n var c = this.c * cos - this.a * sin;\n var d = this.d * cos - this.b * sin;\n\n return new this.constructor(\n a,\n b,\n c,\n d,\n (this.a - a) * cx + (this.c - c) * cy + this.e,\n (this.b - b) * cx + (this.d - d) * cy + this.f\n );\n};\n\n/**\n * rotateFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotateFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * flipX\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipX = function() {\n return new this.constructor(\n -this.a,\n -this.b,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * flipY\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipY = function() {\n return new this.constructor(\n this.a,\n this.b,\n -this.c,\n -this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * skewX\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewX = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a,\n this.b,\n this.c + this.a * t,\n this.d + this.b * t,\n this.e,\n this.f\n );\n};\n\n// TODO: skewXAt\n\n/**\n * skewY\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewY = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a + this.c * t,\n this.b + this.d * t,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n// TODO: skewYAt\n\n/**\n * isIdentity\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isIdentity = function() {\n return (\n this.a === 1.0 &&\n this.b === 0.0 &&\n this.c === 0.0 &&\n this.d === 1.0 &&\n this.e === 0.0 &&\n this.f === 0.0\n );\n};\n\n/**\n * isInvertible\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isInvertible = function() {\n return this.a * this.d - this.b * this.c !== 0.0;\n};\n\n/**\n * getScale\n *\n * @returns {{ scaleX: Number, scaleY: Number }}\n */\nMatrix2D.prototype.getScale = function() {\n return {\n scaleX: Math.sqrt(this.a * this.a + this.c * this.c),\n scaleY: Math.sqrt(this.b * this.b + this.d * this.d)\n };\n};\n\n/**\n * getDecomposition\n *\n * Calculates matrix Singular Value Decomposition\n *\n * The resulting matrices, translation, rotation, scale, and rotation0, return\n * this matrix when they are muliplied together in the listed order\n *\n * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688}\n * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation}\n *\n * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }}\n */\nMatrix2D.prototype.getDecomposition = function () {\n var E = (this.a + this.d) * 0.5;\n var F = (this.a - this.d) * 0.5;\n var G = (this.b + this.c) * 0.5;\n var H = (this.b - this.c) * 0.5;\n\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n var scaleX = Q + R;\n var scaleY = Q - R;\n\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n var theta = (a2 - a1) * 0.5;\n var phi = (a2 + a1) * 0.5;\n\n // TODO: Add static methods to generate translation, rotation, etc.\n // matrices directly\n\n return {\n translation: new this.constructor(1, 0, 0, 1, this.e, this.f),\n rotation: this.constructor.IDENTITY.rotate(phi),\n scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0),\n rotation0: this.constructor.IDENTITY.rotate(theta)\n };\n};\n\n/**\n * equals\n *\n * @param {Matrix2D} that\n * @returns {Boolean}\n */\nMatrix2D.prototype.equals = function(that) {\n return (\n this.a === that.a &&\n this.b === that.b &&\n this.c === that.c &&\n this.d === that.d &&\n this.e === that.e &&\n this.f === that.f\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Matrix2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nMatrix2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.a - that.a) < precision &&\n Math.abs(this.b - that.b) < precision &&\n Math.abs(this.c - that.c) < precision &&\n Math.abs(this.d - that.d) < precision &&\n Math.abs(this.e - that.e) < precision &&\n Math.abs(this.f - that.f) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nMatrix2D.prototype.toString = function() {\n return \"matrix(\" + [this.a, this.b, this.c, this.d, this.e, this.f].join(\",\") + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Matrix2D;\n}\n","// expose classes\n\nexports.Point2D = require('./lib/Point2D');\nexports.Vector2D = require('./lib/Vector2D');\nexports.Matrix2D = require('./lib/Matrix2D');\n","/**\n *\n * Polynomial.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n * \n * contribution {@link http://github.com/Quazistax/kld-polynomial}\n * @copyright 2015 Robert Benko (Quazistax) \n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n * @memberof module:kld-intersections.Intersection~\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n * @memberof module:kld-intersections.Intersection~\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n * @memberof module:kld-intersections\n */\nclass Intersection {\n /**\n * @param {string} status\n * @returns {module:kld-intersections.Intersection}\n */\n constructor(status) {\n this.init(status);\n }\n\n\n /**\n * init\n *\n * @param {string} status\n * @returns {module:kld-intersections.Intersection}\n */\n init(status) {\n this.status = status;\n this.points = [];\n }\n\n\n /**\n * appendPoint\n *\n * @param {module:kld-intersections.Point2D} point\n */\n appendPoint(point) {\n this.points.push(point);\n }\n\n\n /**\n * appendPoints\n *\n * @param {Array} points\n */\n appendPoints(points) {\n this.points = this.points.concat(points);\n }\n}\n\n// static methods\n\n/**\n * intersect\n *\n * @param {module:kld-intersections.IntersectionArgs} shape1\n * @param {module:kld-intersections.IntersectionArgs} shape2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {module:kld-intersections.IntersectionArgs} path\n * @param {module:kld-intersections.IntersectionArgs} shape\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} a3\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @param {module:kld-intersections.Point2D} b3\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} a3\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @param {module:kld-intersections.Point2D} b3\n * @param {module:kld-intersections.Point2D} b4\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} a3\n * @param {module:kld-intersections.Point2D} a4\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @param {module:kld-intersections.Point2D} b3\n * @param {module:kld-intersections.Point2D} b4\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {module:kld-intersections.Point2D} c1\n * @param {number} r1\n * @param {module:kld-intersections.Point2D} c2\n * @param {number} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {module:kld-intersections.Point2D} cc\n * @param {number} r\n * @param {module:kld-intersections.Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {module:kld-intersections.Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {module:kld-intersections.Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {external:Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n * @memberof module:kld-intersections\n */\nclass IntersectionArgs {\n /**\n * @param {string} name\n * @param {Array} args\n * @returns {module:kld-intersections.IntersectionArgs}\n */\n constructor(name, args) {\n this.init(name, args);\n }\n /**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\n init(name, args) {\n this.name = name;\n this.args = args;\n }\n}\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n * @module Shapes\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\n/**\n * @namespace\n */\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n * @module AffineShapes\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\n/**\n * @namespace\n */\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radius\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {module:kld-intersections.Point2D} topLeft\n * @param {module:kld-intersections.Vector2D} size\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n * @module IntersectionQuery\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n * @namespace\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {module:kld-intersections.Point2D} topLeft\n * @param {module:kld-intersections.Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","point","intersect","shape1","shape2","name","intersectPathShape","method","args","apply","path","shape","segment","inter","appendPoints","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","appendPoint","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","IntersectionArgs","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index-umd.js b/dist/index-umd.js index e645cb7..4f21a75 100644 --- a/dist/index-umd.js +++ b/dist/index-umd.js @@ -2027,7 +2027,7 @@ var Polynomial = Polynomial_1; /** - * + * @memberof module:kld-intersections.Intersection~ * @param {*} o * @returns {boolean} */ @@ -2037,9 +2037,9 @@ } /** * closePolygon - * - * @param {Array} points - * @returns {Array} + * @memberof module:kld-intersections.Intersection~ + * @param {Array} points + * @returns {Array} */ @@ -2049,7 +2049,8 @@ return copy; } /** - * Intersection + * Intersection + * @memberof module:kld-intersections */ @@ -2058,6 +2059,7 @@ function () { /** * @param {string} status + * @returns {module:kld-intersections.Intersection} */ function Intersection(status) { _classCallCheck(this, Intersection); @@ -2068,7 +2070,7 @@ * init * * @param {string} status - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2081,7 +2083,7 @@ /** * appendPoint * - * @param {Point2D} point + * @param {module:kld-intersections.Point2D} point */ }, { @@ -2092,7 +2094,7 @@ /** * appendPoints * - * @param {Array} points + * @param {Array} points */ }, { @@ -2108,9 +2110,9 @@ /** * intersect * - * @param {IntersectionArgs} shape1 - * @param {IntersectionArgs} shape2 - * @returns {Intersection} + * @param {module:kld-intersections.IntersectionArgs} shape1 + * @param {module:kld-intersections.IntersectionArgs} shape2 + * @returns {module:kld-intersections.Intersection} */ @@ -2149,9 +2151,9 @@ /** * intersectPathShape * - * @param {IntersectionArgs} path - * @param {IntersectionArgs} shape - * @returns {Intersection} + * @param {module:kld-intersections.IntersectionArgs} path + * @param {module:kld-intersections.IntersectionArgs} shape + * @returns {module:kld-intersections.Intersection} */ @@ -2191,13 +2193,13 @@ /** * intersectBezier2Bezier2 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @returns {module:kld-intersections.Intersection} */ @@ -2303,14 +2305,14 @@ /** * intersectBezier2Bezier3 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @param {module:kld-intersections.Point2D} b4 + * @returns {module:kld-intersections.Intersection} */ @@ -2423,12 +2425,12 @@ /** * intersectBezier2Circle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2438,13 +2440,13 @@ /** * intersectBezier2Ellipse * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2498,12 +2500,12 @@ /** * intersectBezier2Line * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -2588,11 +2590,11 @@ /** * intersectBezier2Polygon * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -2602,11 +2604,11 @@ /** * intersectBezier2Polyline * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -2630,12 +2632,12 @@ /** * intersectBezier2Rectangle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -2663,15 +2665,15 @@ /** * intersectBezier3Bezier3 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} a4 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} a4 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @param {module:kld-intersections.Point2D} b4 + * @returns {module:kld-intersections.Intersection} */ @@ -2817,13 +2819,13 @@ /** * intersectBezier3Circle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2833,14 +2835,14 @@ /** * intersectBezier3Ellipse * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -2906,13 +2908,13 @@ * sketch of the algorithm used here. Without his help, I'm not sure when I * would have figured out this intersection problem. * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -3019,12 +3021,12 @@ /** * intersectBezier3Polygon * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3034,12 +3036,12 @@ /** * intersectBezier3Polyline * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3063,13 +3065,13 @@ /** * intersectBezier3Rectangle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3097,11 +3099,11 @@ /** * intersectCircleCircle * - * @param {Point2D} c1 + * @param {module:kld-intersections.Point2D} c1 * @param {number} r1 - * @param {Point2D} c2 + * @param {module:kld-intersections.Point2D} c2 * @param {number} r2 - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -3132,12 +3134,12 @@ /** * intersectCircleEllipse * - * @param {Point2D} cc + * @param {module:kld-intersections.Point2D} cc * @param {number} r - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -3147,11 +3149,11 @@ /** * intersectCircleLine * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -3195,10 +3197,10 @@ /** * intersectCirclePolygon * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3208,10 +3210,10 @@ /** * intersectCirclePolyline * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3238,11 +3240,11 @@ /** * intersectCircleRectangle * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3278,13 +3280,13 @@ * * NOTE: Rotation will need to be added to this function * - * @param {Point2D} c1 + * @param {module:kld-intersections.Point2D} c1 * @param {number} rx1 * @param {number} ry1 - * @param {Point2D} c2 + * @param {module:kld-intersections.Point2D} c2 * @param {number} rx2 * @param {number} ry2 - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ @@ -3326,12 +3328,12 @@ * * NOTE: Rotation will need to be added to this function * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ @@ -3389,11 +3391,11 @@ /** * intersectEllipsePolygon * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3403,11 +3405,11 @@ /** * intersectEllipsePolyline * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3431,12 +3433,12 @@ /** * intersectEllipseRectangle * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3464,11 +3466,11 @@ /** * intersectLineLine * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ @@ -3499,10 +3501,10 @@ /** * intersectLinePolygon * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3512,10 +3514,10 @@ /** * intersectLinePolyline * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ @@ -3539,11 +3541,11 @@ /** * intersectLineRectangle * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3571,9 +3573,9 @@ /** * intersectPolygonPolygon * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ @@ -3583,9 +3585,9 @@ /** * intersectPolygonPolyline * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ @@ -3595,10 +3597,10 @@ /** * intersectPolygonRectangle * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {Array} points + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3608,9 +3610,9 @@ /** * intersectPolylinePolyline * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ @@ -3634,10 +3636,10 @@ /** * intersectPolylineRectangle * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {Array} points + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ @@ -3665,11 +3667,11 @@ /** * intersectRectangleRectangle * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ @@ -3697,11 +3699,11 @@ /** * intersectRayRay * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ @@ -3730,9 +3732,9 @@ * code along with many other excellent examples are avaiable at his site: * http://www.magic-software.com * - * @param {Array} e1 - * @param {Array} e2 - * @returns {Polynomial} + * @param {Array} e1 + * @param {Array} e2 + * @returns {external:Polynomial} */ @@ -3763,15 +3765,15 @@ /** * IntersectionArgs - * + * @memberof module:kld-intersections */ var IntersectionArgs = /*#__PURE__*/ function () { /** * @param {string} name - * @param {Array} args - * @returns {IntersectionArgs} + * @param {Array} args + * @returns {module:kld-intersections.IntersectionArgs} */ function IntersectionArgs(name, args) { _classCallCheck(this, IntersectionArgs); @@ -3782,7 +3784,7 @@ * init * * @param {string} name - * @param {Array} args + * @param {Array} args */ @@ -3801,7 +3803,12 @@ * Shapes * * @copyright 2017, Kevin Lindsey + * @module Shapes + */ + /** + * @namespace */ + var Shapes = {}; /** * quadraticBezier @@ -3812,7 +3819,7 @@ * @param {number} p2y * @param {number} p3x * @param {number} p3y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.quadraticBezier = function (p1x, p1y, p2x, p2y, p3x, p3y) { @@ -3829,7 +3836,7 @@ * @param {number} p3y * @param {number} p4x * @param {number} p4y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3842,7 +3849,7 @@ * @param {number} centerX * @param {number} centerY * @param {number} radius - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3856,7 +3863,7 @@ * @param {number} centerY * @param {number} radiusX * @param {number} radiusY - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3870,7 +3877,7 @@ * @param {number} p1y * @param {number} p2x * @param {number} p2y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3880,8 +3887,8 @@ /** * path * - * @param {Array} segments - * @returns {IntersectionArgs} + * @param {Array} segments + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3892,7 +3899,7 @@ * polygon * * @param {Array} coords - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3909,7 +3916,7 @@ * polyline * * @param {Array} coords - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3929,7 +3936,7 @@ * @param {number} y * @param {number} width * @param {number} height - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3941,15 +3948,19 @@ * AffineShapes * * @copyright 2017, Kevin Lindsey + * @module AffineShapes + */ + /** + * @namespace */ + var AffineShapes = {}; /** * quadraticBezier - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.quadraticBezier = function (p1, p2, p3) { @@ -3958,11 +3969,11 @@ /** * cubicBezier * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3972,9 +3983,9 @@ /** * circle * - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} center * @param {number} radius - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3984,10 +3995,10 @@ /** * ellipse * - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} center * @param {number} radiusX * @param {number} radiusY - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -3997,9 +4008,9 @@ /** * line * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4009,8 +4020,8 @@ /** * path * - * @param {Array} segments - * @returns {IntersectionArgs} + * @param {Array} segments + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4020,8 +4031,8 @@ /** * polygon * - * @param {Array} points - * @returns {IntersectionArgs} + * @param {Array} points + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4031,8 +4042,8 @@ /** * polyline * - * @param {Array} points - * @returns {IntersectionArgs} + * @param {Array} points + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4042,9 +4053,9 @@ /** * rectangle * - * @param {Point2D} topLeft - * @param {Vector2D} size - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} topLeft + * @param {module:kld-intersections.Vector2D} size + * @returns {module:kld-intersections.IntersectionArgs} */ @@ -4057,18 +4068,18 @@ * IntersectionQuery.js * * @copyright 2017 Kevin Lindsey - * + * @module IntersectionQuery */ /** - * + * @namespace */ var IntersectionQuery = {}; /** * pointInCircle * - * @param {Point2D} point - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} center * @param {number} radius * @returns {boolean} */ @@ -4080,8 +4091,8 @@ /** * pointInEllipse * - * @param {Point2D} point - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} center * @param {number} radiusX * @param {number} radiusY * @returns {boolean} @@ -4095,8 +4106,8 @@ /** * pointInPolyline * - * @param {Point2D} point - * @param {Array} points + * @param {module:kld-intersections.Point2D} point + * @param {Array} points */ @@ -4128,8 +4139,8 @@ /** * pointInPolyline * - * @param {Point2D} point - * @param {Array} points + * @param {module:kld-intersections.Point2D} point + * @param {Array} points */ @@ -4137,9 +4148,9 @@ /** * pointInRectangle * - * @param {Point2D} point - * @param {Point2D} topLeft - * @param {Point2D} bottomRight + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} topLeft + * @param {module:kld-intersections.Point2D} bottomRight * @returns {boolean} */ @@ -4147,7 +4158,12 @@ return topLeft.x <= point.x && point.x < bottomRight.x && topLeft.y <= point.y && point.y < bottomRight.y; }; - // expose module classes + /** + * @module kld-intersections + */ + /** + * @external Polynomial + */ exports.AffineShapes = AffineShapes; exports.Intersection = Intersection; diff --git a/dist/index-umd.min.js.map b/dist/index-umd.min.js.map index b4a1187..4d17216 100644 --- a/dist/index-umd.min.js.map +++ b/dist/index-umd.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index-umd.min.js","sources":["../node_modules/kld-affine/lib/Point2D.js","../node_modules/kld-affine/lib/Vector2D.js","../node_modules/kld-affine/lib/Matrix2D.js","../node_modules/kld-affine/index.js","../node_modules/kld-polynomial/lib/Polynomial.js","../node_modules/kld-polynomial/lib/SqrtPolynomial.js","../node_modules/kld-polynomial/index.js","../lib/Intersection.js","../lib/IntersectionArgs.js","../lib/Shapes.js","../lib/AffineShapes.js","../lib/IntersectionQuery.js"],"sourcesContent":["/**\n *\n * Point2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Point2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Point2D}\n */\nfunction Point2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * clone\n *\n * @returns {Point2D}\n */\nPoint2D.prototype.clone = function() {\n return new this.constructor(this.x, this.y);\n};\n\n/**\n * add\n *\n * @param {Point2D|Vector2D} that\n * @returns {Point2D}\n */\nPoint2D.prototype.add = function(that) {\n return new this.constructor(this.x+that.x, this.y+that.y);\n};\n\n/**\n * subtract\n *\n * @param { Vector2D | Point2D } that\n * @returns {Point2D}\n */\nPoint2D.prototype.subtract = function(that) {\n return new this.constructor(this.x-that.x, this.y-that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x*scalar, this.y*scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x/scalar, this.y/scalar);\n};\n\n/**\n * equals\n *\n * @param {Point2D} that\n * @returns {Boolean}\n */\nPoint2D.prototype.equals = function(that) {\n return ( this.x === that.x && this.y === that.y );\n};\n\n/**\n * precisionEquals\n *\n * @param {Point2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nPoint2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n// utility methods\n\n/**\n * lerp\n *\n * @param { Vector2D | Point2D } that\n * @param {Number} t\n @ @returns {Point2D}\n */\nPoint2D.prototype.lerp = function(that, t) {\n var omt = 1.0 - t;\n\n return new this.constructor(\n this.x * omt + that.x * t,\n this.y * omt + that.y * t\n );\n};\n\n/**\n * distanceFrom\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.distanceFrom = function(that) {\n var dx = this.x - that.x;\n var dy = this.y - that.y;\n\n return Math.sqrt(dx*dx + dy*dy);\n};\n\n/**\n * min\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.min = function(that) {\n return new this.constructor(\n Math.min( this.x, that.x ),\n Math.min( this.y, that.y )\n );\n};\n\n/**\n * max\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.max = function(that) {\n return new this.constructor(\n Math.max( this.x, that.x ),\n Math.max( this.y, that.y )\n );\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @result {Point2D}\n */\nPoint2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y + matrix.e,\n matrix.b * this.x + matrix.d * this.y + matrix.f\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nPoint2D.prototype.toString = function() {\n return \"point(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Point2D;\n}\n","/**\n *\n * Vector2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Vector2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Vector2D}\n */\nfunction Vector2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * fromPoints\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {Vector2D}\n */\nVector2D.fromPoints = function(p1, p2) {\n return new Vector2D(\n p2.x - p1.x,\n p2.y - p1.y\n );\n};\n\n/**\n * length\n *\n * @returns {Number}\n */\nVector2D.prototype.length = function() {\n return Math.sqrt(this.x*this.x + this.y*this.y);\n};\n\n/**\n * magnitude\n *\n * @returns {Number}\n */\nVector2D.prototype.magnitude = function() {\n return this.x*this.x + this.y*this.y;\n};\n\n/**\n * dot\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.dot = function(that) {\n return this.x*that.x + this.y*that.y;\n};\n\n/**\n * cross\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.cross = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * determinant\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.determinant = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * unit\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.unit = function() {\n return this.divide( this.length() );\n};\n\n/**\n * add\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.add = function(that) {\n return new this.constructor(this.x + that.x, this.y + that.y);\n};\n\n/**\n * subtract\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.subtract = function(that) {\n return new this.constructor(this.x - that.x, this.y - that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x * scalar, this.y * scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x / scalar, this.y / scalar);\n};\n\n/**\n * angleBetween\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.angleBetween = function(that) {\n var cos = this.dot(that) / (this.length() * that.length());\n cos = Math.max(-1, Math.min(cos, 1));\n var radians = Math.acos(cos);\n\n return (this.cross(that) < 0.0) ? -radians : radians;\n};\n\n/**\n * Find a vector is that is perpendicular to this vector\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.perp = function() {\n return new this.constructor(-this.y, this.x);\n};\n\n/**\n * Find the component of the specified vector that is perpendicular to\n * this vector\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.perpendicular = function(that) {\n return this.subtract(this.project(that));\n};\n\n/**\n * project\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.project = function(that) {\n var percent = this.dot(that) / that.dot(that);\n\n return that.multiply(percent);\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @returns {Vector2D}\n */\nVector2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y,\n matrix.b * this.x + matrix.d * this.y\n );\n};\n\n/**\n * equals\n *\n * @param {Vector2D} that\n * @returns {Boolean}\n */\nVector2D.prototype.equals = function(that) {\n return (\n this.x === that.x &&\n this.y === that.y\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Vector2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nVector2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nVector2D.prototype.toString = function() {\n return \"vector(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Vector2D;\n}\n","/**\n * Matrix2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n */\n\nfunction setReadonlyProperty(object, property, value) {\n Object.defineProperty(object, property, {\n value: value,\n writable: false,\n enumerable: true,\n configurable: false\n });\n}\n\n/**\n * Identity matrix\n *\n * @returns {Matrix2D}\n */\nsetReadonlyProperty(Matrix2D, \"IDENTITY\", new Matrix2D(1, 0, 0, 1, 0, 0));\nsetReadonlyProperty(Matrix2D.IDENTITY, \"isIdentity\", function () { return true; });\n\n\n/**\n * Matrix2D\n *\n * [a c e]\n * [b d f]\n * [0 0 1]\n *\n * @param {Number} a\n * @param {Number} b\n * @param {Number} c\n * @param {Number} d\n * @param {Number} e\n * @param {Number} f\n * @returns {Matrix2D}\n */\nfunction Matrix2D(a, b, c, d, e, f) {\n setReadonlyProperty(this, \"a\", (a !== undefined) ? a : 1);\n setReadonlyProperty(this, \"b\", (b !== undefined) ? b : 0);\n setReadonlyProperty(this, \"c\", (c !== undefined) ? c : 0);\n setReadonlyProperty(this, \"d\", (d !== undefined) ? d : 1);\n setReadonlyProperty(this, \"e\", (e !== undefined) ? e : 0);\n setReadonlyProperty(this, \"f\", (f !== undefined) ? f : 0);\n}\n\n\n// *** STATIC METHODS\n\n/**\n * translation\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.translation = function(tx, ty) {\n return new Matrix2D(1, 0, 0, 1, tx, ty);\n};\n\n/**\n * scaling\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.scaling = function(scale) {\n return new Matrix2D(scale, 0, 0, scale, 0, 0);\n};\n\n/**\n * scalingAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.scalingAt = function(scale, center) {\n return new Matrix2D(\n scale,\n 0,\n 0,\n scale,\n center.x - center.x * scale,\n center.y - center.y * scale\n );\n}\n\n\n/**\n * nonUniformScaling\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScaling = function(scaleX, scaleY) {\n return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0);\n};\n\n/**\n * nonUniformScalingAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScalingAt = function(scaleX, scaleY, center) {\n return new Matrix2D(\n scaleX,\n 0,\n 0,\n scaleY,\n center.x - center.x * scaleX,\n center.y - center.y * scaleY\n );\n};\n\n/**\n * rotation\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.rotation = function(radians) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * rotationAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.rotationAt = function(radians, center) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(\n c,\n s,\n -s,\n c,\n center.x - center.x * c + center.y * s,\n center.y - center.y * c - center.x * s\n );\n};\n\n/**\n * rotationFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.rotationFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * xFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.xFlip = function() {\n return new Matrix2D(-1, 0, 0, 1, 0, 0);\n};\n\n/**\n * yFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.yFlip = function() {\n return new Matrix2D(1, 0, 0, -1, 0, 0);\n};\n\n/**\n * xSkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.xSkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, 0, t, 1, 0, 0);\n};\n\n/**\n * ySkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.ySkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, t, 0, 1, 0, 0);\n};\n\n\n// *** METHODS\n\n/**\n * multiply\n *\n * @pararm {Matrix2D} that\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.multiply = function (that) {\n if (this.isIdentity()) {\n return that;\n }\n\n if (that.isIdentity()) {\n return this;\n }\n\n return new this.constructor(\n this.a * that.a + this.c * that.b,\n this.b * that.a + this.d * that.b,\n this.a * that.c + this.c * that.d,\n this.b * that.c + this.d * that.d,\n this.a * that.e + this.c * that.f + this.e,\n this.b * that.e + this.d * that.f + this.f\n );\n};\n\n/**\n * inverse\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.inverse = function () {\n if (this.isIdentity()) {\n return this;\n }\n\n var det1 = this.a * this.d - this.b * this.c;\n\n if ( det1 === 0.0 ) {\n throw(\"Matrix is not invertible\");\n }\n\n var idet = 1.0 / det1;\n var det2 = this.f * this.c - this.e * this.d;\n var det3 = this.e * this.b - this.f * this.a;\n\n return new this.constructor(\n this.d * idet,\n -this.b * idet,\n -this.c * idet,\n this.a * idet,\n det2 * idet,\n det3 * idet\n );\n};\n\n/**\n * translate\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.translate = function(tx, ty) {\n return new this.constructor(\n this.a,\n this.b,\n this.c,\n this.d,\n this.a * tx + this.c * ty + this.e,\n this.b * tx + this.d * ty + this.f\n );\n};\n\n/**\n * scale\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scale = function(scale) {\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleAt = function(scale, center) {\n var dx = center.x - scale * center.x;\n var dy = center.y - scale * center.y;\n\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * scaleNonUniform\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniform = function(scaleX, scaleY) {\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleNonUniformAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniformAt = function(scaleX, scaleY, center) {\n var dx = center.x - scaleX * center.x;\n var dy = center.y - scaleY * center.y;\n\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * rotate\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotate = function(radians) {\n var c = Math.cos(radians);\n var s = Math.sin(radians);\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * rotateAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @result {Matrix2D}\n */\nMatrix2D.prototype.rotateAt = function(radians, center) {\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var cx = center.x;\n var cy = center.y;\n\n var a = this.a * cos + this.c * sin;\n var b = this.b * cos + this.d * sin;\n var c = this.c * cos - this.a * sin;\n var d = this.d * cos - this.b * sin;\n\n return new this.constructor(\n a,\n b,\n c,\n d,\n (this.a - a) * cx + (this.c - c) * cy + this.e,\n (this.b - b) * cx + (this.d - d) * cy + this.f\n );\n};\n\n/**\n * rotateFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotateFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * flipX\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipX = function() {\n return new this.constructor(\n -this.a,\n -this.b,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * flipY\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipY = function() {\n return new this.constructor(\n this.a,\n this.b,\n -this.c,\n -this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * skewX\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewX = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a,\n this.b,\n this.c + this.a * t,\n this.d + this.b * t,\n this.e,\n this.f\n );\n};\n\n// TODO: skewXAt\n\n/**\n * skewY\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewY = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a + this.c * t,\n this.b + this.d * t,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n// TODO: skewYAt\n\n/**\n * isIdentity\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isIdentity = function() {\n return (\n this.a === 1.0 &&\n this.b === 0.0 &&\n this.c === 0.0 &&\n this.d === 1.0 &&\n this.e === 0.0 &&\n this.f === 0.0\n );\n};\n\n/**\n * isInvertible\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isInvertible = function() {\n return this.a * this.d - this.b * this.c !== 0.0;\n};\n\n/**\n * getScale\n *\n * @returns {{ scaleX: Number, scaleY: Number }}\n */\nMatrix2D.prototype.getScale = function() {\n return {\n scaleX: Math.sqrt(this.a * this.a + this.c * this.c),\n scaleY: Math.sqrt(this.b * this.b + this.d * this.d)\n };\n};\n\n/**\n * getDecomposition\n *\n * Calculates matrix Singular Value Decomposition\n *\n * The resulting matrices, translation, rotation, scale, and rotation0, return\n * this matrix when they are muliplied together in the listed order\n *\n * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688}\n * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation}\n *\n * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }}\n */\nMatrix2D.prototype.getDecomposition = function () {\n var E = (this.a + this.d) * 0.5;\n var F = (this.a - this.d) * 0.5;\n var G = (this.b + this.c) * 0.5;\n var H = (this.b - this.c) * 0.5;\n\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n var scaleX = Q + R;\n var scaleY = Q - R;\n\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n var theta = (a2 - a1) * 0.5;\n var phi = (a2 + a1) * 0.5;\n\n // TODO: Add static methods to generate translation, rotation, etc.\n // matrices directly\n\n return {\n translation: new this.constructor(1, 0, 0, 1, this.e, this.f),\n rotation: this.constructor.IDENTITY.rotate(phi),\n scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0),\n rotation0: this.constructor.IDENTITY.rotate(theta)\n };\n};\n\n/**\n * equals\n *\n * @param {Matrix2D} that\n * @returns {Boolean}\n */\nMatrix2D.prototype.equals = function(that) {\n return (\n this.a === that.a &&\n this.b === that.b &&\n this.c === that.c &&\n this.d === that.d &&\n this.e === that.e &&\n this.f === that.f\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Matrix2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nMatrix2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.a - that.a) < precision &&\n Math.abs(this.b - that.b) < precision &&\n Math.abs(this.c - that.c) < precision &&\n Math.abs(this.d - that.d) < precision &&\n Math.abs(this.e - that.e) < precision &&\n Math.abs(this.f - that.f) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nMatrix2D.prototype.toString = function() {\n return \"matrix(\" + [this.a, this.b, this.c, this.d, this.e, this.f].join(\",\") + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Matrix2D;\n}\n","// expose classes\n\nexports.Point2D = require('./lib/Point2D');\nexports.Vector2D = require('./lib/Vector2D');\nexports.Matrix2D = require('./lib/Matrix2D');\n","/**\n *\n * Polynomial.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n * \n * contribution {@link http://github.com/Quazistax/kld-polynomial}\n * @copyright 2015 Robert Benko (Quazistax) \n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n *\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n *\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n *\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n */\nclass Intersection {\n /**\n * @param {string} status\n */\n constructor(status) {\n this.init(status);\n }\n\n\n /**\n * init\n *\n * @param {string} status\n * @returns {Intersection}\n */\n init(status) {\n this.status = status;\n this.points = [];\n }\n\n\n /**\n * appendPoint\n *\n * @param {Point2D} point\n */\n appendPoint(point) {\n this.points.push(point);\n }\n\n\n /**\n * appendPoints\n *\n * @param {Array} points\n */\n appendPoints(points) {\n this.points = this.points.concat(points);\n }\n}\n\n// static methods\n\n/**\n * intersect\n *\n * @param {IntersectionArgs} shape1\n * @param {IntersectionArgs} shape2\n * @returns {Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {IntersectionArgs} path\n * @param {IntersectionArgs} shape\n * @returns {Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} a3\n * @param {Point2D} a4\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @param {Point2D} b3\n * @param {Point2D} b4\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} c\n * @param {number} r\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {Point2D} c1\n * @param {number} r1\n * @param {Point2D} c2\n * @param {number} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {Point2D} cc\n * @param {number} r\n * @param {Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {Point2D} c\n * @param {number} r\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Array} points\n * @returns {Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {Point2D} r1\n * @param {Point2D} r2\n * @returns {Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {Point2D} a1\n * @param {Point2D} a2\n * @param {Point2D} b1\n * @param {Point2D} b2\n * @returns {Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n *\n */\nclass IntersectionArgs {\n /**\n * @param {string} name\n * @param {Array} args\n * @returns {IntersectionArgs}\n */\n constructor(name, args) {\n this.init(name, args);\n }\n /**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\n init(name, args) {\n this.name = name;\n this.args = args;\n }\n}\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @returns {IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @param {Point2D} p3\n * @param {Point2D} p4\n * @returns {IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {Point2D} center\n * @param {number} radius\n * @returns {IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {Point2D} topLeft\n * @param {Vector2D} size\n * @returns {IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n *\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n *\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {Point2D} point\n * @param {Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {Point2D} point\n * @param {Point2D} topLeft\n * @param {Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","point","intersect","shape1","shape2","name","intersectPathShape","method","args","apply","path","shape","segment","inter","appendPoints","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","appendPoint","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","IntersectionArgs","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-umd.min.js","sources":["../node_modules/kld-affine/lib/Point2D.js","../node_modules/kld-affine/lib/Vector2D.js","../node_modules/kld-affine/lib/Matrix2D.js","../node_modules/kld-affine/index.js","../node_modules/kld-polynomial/lib/Polynomial.js","../node_modules/kld-polynomial/lib/SqrtPolynomial.js","../node_modules/kld-polynomial/index.js","../lib/Intersection.js","../lib/IntersectionArgs.js","../lib/Shapes.js","../lib/AffineShapes.js","../lib/IntersectionQuery.js"],"sourcesContent":["/**\n *\n * Point2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Point2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Point2D}\n */\nfunction Point2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * clone\n *\n * @returns {Point2D}\n */\nPoint2D.prototype.clone = function() {\n return new this.constructor(this.x, this.y);\n};\n\n/**\n * add\n *\n * @param {Point2D|Vector2D} that\n * @returns {Point2D}\n */\nPoint2D.prototype.add = function(that) {\n return new this.constructor(this.x+that.x, this.y+that.y);\n};\n\n/**\n * subtract\n *\n * @param { Vector2D | Point2D } that\n * @returns {Point2D}\n */\nPoint2D.prototype.subtract = function(that) {\n return new this.constructor(this.x-that.x, this.y-that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x*scalar, this.y*scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Point2D}\n */\nPoint2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x/scalar, this.y/scalar);\n};\n\n/**\n * equals\n *\n * @param {Point2D} that\n * @returns {Boolean}\n */\nPoint2D.prototype.equals = function(that) {\n return ( this.x === that.x && this.y === that.y );\n};\n\n/**\n * precisionEquals\n *\n * @param {Point2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nPoint2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n// utility methods\n\n/**\n * lerp\n *\n * @param { Vector2D | Point2D } that\n * @param {Number} t\n @ @returns {Point2D}\n */\nPoint2D.prototype.lerp = function(that, t) {\n var omt = 1.0 - t;\n\n return new this.constructor(\n this.x * omt + that.x * t,\n this.y * omt + that.y * t\n );\n};\n\n/**\n * distanceFrom\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.distanceFrom = function(that) {\n var dx = this.x - that.x;\n var dy = this.y - that.y;\n\n return Math.sqrt(dx*dx + dy*dy);\n};\n\n/**\n * min\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.min = function(that) {\n return new this.constructor(\n Math.min( this.x, that.x ),\n Math.min( this.y, that.y )\n );\n};\n\n/**\n * max\n *\n * @param {Point2D} that\n * @returns {Number}\n */\nPoint2D.prototype.max = function(that) {\n return new this.constructor(\n Math.max( this.x, that.x ),\n Math.max( this.y, that.y )\n );\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @result {Point2D}\n */\nPoint2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y + matrix.e,\n matrix.b * this.x + matrix.d * this.y + matrix.f\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nPoint2D.prototype.toString = function() {\n return \"point(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Point2D;\n}\n","/**\n *\n * Vector2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n *\n */\n\n/**\n * Vector2D\n *\n * @param {Number} x\n * @param {Number} y\n * @returns {Vector2D}\n */\nfunction Vector2D(x, y) {\n Object.defineProperties(this, {\n \"x\": {\n value: x !== undefined ? x : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n },\n \"y\": {\n value: y !== undefined ? y : 0.0,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n}\n\n/**\n * fromPoints\n *\n * @param {Point2D} p1\n * @param {Point2D} p2\n * @returns {Vector2D}\n */\nVector2D.fromPoints = function(p1, p2) {\n return new Vector2D(\n p2.x - p1.x,\n p2.y - p1.y\n );\n};\n\n/**\n * length\n *\n * @returns {Number}\n */\nVector2D.prototype.length = function() {\n return Math.sqrt(this.x*this.x + this.y*this.y);\n};\n\n/**\n * magnitude\n *\n * @returns {Number}\n */\nVector2D.prototype.magnitude = function() {\n return this.x*this.x + this.y*this.y;\n};\n\n/**\n * dot\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.dot = function(that) {\n return this.x*that.x + this.y*that.y;\n};\n\n/**\n * cross\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.cross = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * determinant\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.determinant = function(that) {\n return this.x*that.y - this.y*that.x;\n};\n\n/**\n * unit\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.unit = function() {\n return this.divide( this.length() );\n};\n\n/**\n * add\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.add = function(that) {\n return new this.constructor(this.x + that.x, this.y + that.y);\n};\n\n/**\n * subtract\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.subtract = function(that) {\n return new this.constructor(this.x - that.x, this.y - that.y);\n};\n\n/**\n * multiply\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.multiply = function(scalar) {\n return new this.constructor(this.x * scalar, this.y * scalar);\n};\n\n/**\n * divide\n *\n * @param {Number} scalar\n * @returns {Vector2D}\n */\nVector2D.prototype.divide = function(scalar) {\n return new this.constructor(this.x / scalar, this.y / scalar);\n};\n\n/**\n * angleBetween\n *\n * @param {Vector2D} that\n * @returns {Number}\n */\nVector2D.prototype.angleBetween = function(that) {\n var cos = this.dot(that) / (this.length() * that.length());\n cos = Math.max(-1, Math.min(cos, 1));\n var radians = Math.acos(cos);\n\n return (this.cross(that) < 0.0) ? -radians : radians;\n};\n\n/**\n * Find a vector is that is perpendicular to this vector\n *\n * @returns {Vector2D}\n */\nVector2D.prototype.perp = function() {\n return new this.constructor(-this.y, this.x);\n};\n\n/**\n * Find the component of the specified vector that is perpendicular to\n * this vector\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.perpendicular = function(that) {\n return this.subtract(this.project(that));\n};\n\n/**\n * project\n *\n * @param {Vector2D} that\n * @returns {Vector2D}\n */\nVector2D.prototype.project = function(that) {\n var percent = this.dot(that) / that.dot(that);\n\n return that.multiply(percent);\n};\n\n/**\n * transform\n *\n * @param {Matrix2D}\n * @returns {Vector2D}\n */\nVector2D.prototype.transform = function(matrix) {\n return new this.constructor(\n matrix.a * this.x + matrix.c * this.y,\n matrix.b * this.x + matrix.d * this.y\n );\n};\n\n/**\n * equals\n *\n * @param {Vector2D} that\n * @returns {Boolean}\n */\nVector2D.prototype.equals = function(that) {\n return (\n this.x === that.x &&\n this.y === that.y\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Vector2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nVector2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.x - that.x) < precision &&\n Math.abs(this.y - that.y) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nVector2D.prototype.toString = function() {\n return \"vector(\" + this.x + \",\" + this.y + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Vector2D;\n}\n","/**\n * Matrix2D.js\n *\n * copyright 2001-2002, 2013, 2017 Kevin Lindsey\n */\n\nfunction setReadonlyProperty(object, property, value) {\n Object.defineProperty(object, property, {\n value: value,\n writable: false,\n enumerable: true,\n configurable: false\n });\n}\n\n/**\n * Identity matrix\n *\n * @returns {Matrix2D}\n */\nsetReadonlyProperty(Matrix2D, \"IDENTITY\", new Matrix2D(1, 0, 0, 1, 0, 0));\nsetReadonlyProperty(Matrix2D.IDENTITY, \"isIdentity\", function () { return true; });\n\n\n/**\n * Matrix2D\n *\n * [a c e]\n * [b d f]\n * [0 0 1]\n *\n * @param {Number} a\n * @param {Number} b\n * @param {Number} c\n * @param {Number} d\n * @param {Number} e\n * @param {Number} f\n * @returns {Matrix2D}\n */\nfunction Matrix2D(a, b, c, d, e, f) {\n setReadonlyProperty(this, \"a\", (a !== undefined) ? a : 1);\n setReadonlyProperty(this, \"b\", (b !== undefined) ? b : 0);\n setReadonlyProperty(this, \"c\", (c !== undefined) ? c : 0);\n setReadonlyProperty(this, \"d\", (d !== undefined) ? d : 1);\n setReadonlyProperty(this, \"e\", (e !== undefined) ? e : 0);\n setReadonlyProperty(this, \"f\", (f !== undefined) ? f : 0);\n}\n\n\n// *** STATIC METHODS\n\n/**\n * translation\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.translation = function(tx, ty) {\n return new Matrix2D(1, 0, 0, 1, tx, ty);\n};\n\n/**\n * scaling\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.scaling = function(scale) {\n return new Matrix2D(scale, 0, 0, scale, 0, 0);\n};\n\n/**\n * scalingAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.scalingAt = function(scale, center) {\n return new Matrix2D(\n scale,\n 0,\n 0,\n scale,\n center.x - center.x * scale,\n center.y - center.y * scale\n );\n}\n\n\n/**\n * nonUniformScaling\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScaling = function(scaleX, scaleY) {\n return new Matrix2D(scaleX, 0, 0, scaleY, 0, 0);\n};\n\n/**\n * nonUniformScalingAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.nonUniformScalingAt = function(scaleX, scaleY, center) {\n return new Matrix2D(\n scaleX,\n 0,\n 0,\n scaleY,\n center.x - center.x * scaleX,\n center.y - center.y * scaleY\n );\n};\n\n/**\n * rotation\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.rotation = function(radians) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * rotationAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.rotationAt = function(radians, center) {\n let c = Math.cos(radians);\n let s = Math.sin(radians);\n\n return new Matrix2D(\n c,\n s,\n -s,\n c,\n center.x - center.x * c + center.y * s,\n center.y - center.y * c - center.x * s\n );\n};\n\n/**\n * rotationFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.rotationFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new Matrix2D(c, s, -s, c, 0, 0);\n};\n\n/**\n * xFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.xFlip = function() {\n return new Matrix2D(-1, 0, 0, 1, 0, 0);\n};\n\n/**\n * yFlip\n *\n * @returns {Matrix2D}\n */\nMatrix2D.yFlip = function() {\n return new Matrix2D(1, 0, 0, -1, 0, 0);\n};\n\n/**\n * xSkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.xSkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, 0, t, 1, 0, 0);\n};\n\n/**\n * ySkew\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.ySkew = function(radians) {\n var t = Math.tan(radians);\n\n return new Matrix2D(1, t, 0, 1, 0, 0);\n};\n\n\n// *** METHODS\n\n/**\n * multiply\n *\n * @pararm {Matrix2D} that\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.multiply = function (that) {\n if (this.isIdentity()) {\n return that;\n }\n\n if (that.isIdentity()) {\n return this;\n }\n\n return new this.constructor(\n this.a * that.a + this.c * that.b,\n this.b * that.a + this.d * that.b,\n this.a * that.c + this.c * that.d,\n this.b * that.c + this.d * that.d,\n this.a * that.e + this.c * that.f + this.e,\n this.b * that.e + this.d * that.f + this.f\n );\n};\n\n/**\n * inverse\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.inverse = function () {\n if (this.isIdentity()) {\n return this;\n }\n\n var det1 = this.a * this.d - this.b * this.c;\n\n if ( det1 === 0.0 ) {\n throw(\"Matrix is not invertible\");\n }\n\n var idet = 1.0 / det1;\n var det2 = this.f * this.c - this.e * this.d;\n var det3 = this.e * this.b - this.f * this.a;\n\n return new this.constructor(\n this.d * idet,\n -this.b * idet,\n -this.c * idet,\n this.a * idet,\n det2 * idet,\n det3 * idet\n );\n};\n\n/**\n * translate\n *\n * @param {Number} tx\n * @param {Number} ty\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.translate = function(tx, ty) {\n return new this.constructor(\n this.a,\n this.b,\n this.c,\n this.d,\n this.a * tx + this.c * ty + this.e,\n this.b * tx + this.d * ty + this.f\n );\n};\n\n/**\n * scale\n *\n * @param {Number} scale\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scale = function(scale) {\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleAt\n *\n * @param {Number} scale\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleAt = function(scale, center) {\n var dx = center.x - scale * center.x;\n var dy = center.y - scale * center.y;\n\n return new this.constructor(\n this.a * scale,\n this.b * scale,\n this.c * scale,\n this.d * scale,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * scaleNonUniform\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniform = function(scaleX, scaleY) {\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.e,\n this.f\n );\n};\n\n/**\n * scaleNonUniformAt\n *\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Point2D} center\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.scaleNonUniformAt = function(scaleX, scaleY, center) {\n var dx = center.x - scaleX * center.x;\n var dy = center.y - scaleY * center.y;\n\n return new this.constructor(\n this.a * scaleX,\n this.b * scaleX,\n this.c * scaleY,\n this.d * scaleY,\n this.a * dx + this.c * dy + this.e,\n this.b * dx + this.d * dy + this.f\n );\n};\n\n/**\n * rotate\n *\n * @param {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotate = function(radians) {\n var c = Math.cos(radians);\n var s = Math.sin(radians);\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * rotateAt\n *\n * @param {Number} radians\n * @param {Point2D} center\n * @result {Matrix2D}\n */\nMatrix2D.prototype.rotateAt = function(radians, center) {\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var cx = center.x;\n var cy = center.y;\n\n var a = this.a * cos + this.c * sin;\n var b = this.b * cos + this.d * sin;\n var c = this.c * cos - this.a * sin;\n var d = this.d * cos - this.b * sin;\n\n return new this.constructor(\n a,\n b,\n c,\n d,\n (this.a - a) * cx + (this.c - c) * cy + this.e,\n (this.b - b) * cx + (this.d - d) * cy + this.f\n );\n};\n\n/**\n * rotateFromVector\n *\n * @param {Vector2D}\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.rotateFromVector = function(vector) {\n var unit = vector.unit();\n var c = unit.x; // cos\n var s = unit.y; // sin\n\n return new this.constructor(\n this.a * c + this.c * s,\n this.b * c + this.d * s,\n this.a * -s + this.c * c,\n this.b * -s + this.d * c,\n this.e,\n this.f\n );\n};\n\n/**\n * flipX\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipX = function() {\n return new this.constructor(\n -this.a,\n -this.b,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * flipY\n *\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.flipY = function() {\n return new this.constructor(\n this.a,\n this.b,\n -this.c,\n -this.d,\n this.e,\n this.f\n );\n};\n\n/**\n * skewX\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewX = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a,\n this.b,\n this.c + this.a * t,\n this.d + this.b * t,\n this.e,\n this.f\n );\n};\n\n// TODO: skewXAt\n\n/**\n * skewY\n *\n * @pararm {Number} radians\n * @returns {Matrix2D}\n */\nMatrix2D.prototype.skewY = function(radians) {\n var t = Math.tan(radians);\n\n return new this.constructor(\n this.a + this.c * t,\n this.b + this.d * t,\n this.c,\n this.d,\n this.e,\n this.f\n );\n};\n\n// TODO: skewYAt\n\n/**\n * isIdentity\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isIdentity = function() {\n return (\n this.a === 1.0 &&\n this.b === 0.0 &&\n this.c === 0.0 &&\n this.d === 1.0 &&\n this.e === 0.0 &&\n this.f === 0.0\n );\n};\n\n/**\n * isInvertible\n *\n * @returns {Boolean}\n */\nMatrix2D.prototype.isInvertible = function() {\n return this.a * this.d - this.b * this.c !== 0.0;\n};\n\n/**\n * getScale\n *\n * @returns {{ scaleX: Number, scaleY: Number }}\n */\nMatrix2D.prototype.getScale = function() {\n return {\n scaleX: Math.sqrt(this.a * this.a + this.c * this.c),\n scaleY: Math.sqrt(this.b * this.b + this.d * this.d)\n };\n};\n\n/**\n * getDecomposition\n *\n * Calculates matrix Singular Value Decomposition\n *\n * The resulting matrices, translation, rotation, scale, and rotation0, return\n * this matrix when they are muliplied together in the listed order\n *\n * @see Jim Blinn's article {@link http://dx.doi.org/10.1109/38.486688}\n * @see {@link http://math.stackexchange.com/questions/861674/decompose-a-2d-arbitrary-transform-into-only-scaling-and-rotation}\n *\n * @returns {{ translation: Matrix2D, rotation: Matrix2D, scale: Matrix2D, rotation0: Matrix2D }}\n */\nMatrix2D.prototype.getDecomposition = function () {\n var E = (this.a + this.d) * 0.5;\n var F = (this.a - this.d) * 0.5;\n var G = (this.b + this.c) * 0.5;\n var H = (this.b - this.c) * 0.5;\n\n var Q = Math.sqrt(E * E + H * H);\n var R = Math.sqrt(F * F + G * G);\n var scaleX = Q + R;\n var scaleY = Q - R;\n\n var a1 = Math.atan2(G, F);\n var a2 = Math.atan2(H, E);\n var theta = (a2 - a1) * 0.5;\n var phi = (a2 + a1) * 0.5;\n\n // TODO: Add static methods to generate translation, rotation, etc.\n // matrices directly\n\n return {\n translation: new this.constructor(1, 0, 0, 1, this.e, this.f),\n rotation: this.constructor.IDENTITY.rotate(phi),\n scale: new this.constructor(scaleX, 0, 0, scaleY, 0, 0),\n rotation0: this.constructor.IDENTITY.rotate(theta)\n };\n};\n\n/**\n * equals\n *\n * @param {Matrix2D} that\n * @returns {Boolean}\n */\nMatrix2D.prototype.equals = function(that) {\n return (\n this.a === that.a &&\n this.b === that.b &&\n this.c === that.c &&\n this.d === that.d &&\n this.e === that.e &&\n this.f === that.f\n );\n};\n\n/**\n * precisionEquals\n *\n * @param {Matrix2D} that\n * @param {Number} precision\n * @returns {Boolean}\n */\nMatrix2D.prototype.precisionEquals = function(that, precision) {\n return (\n Math.abs(this.a - that.a) < precision &&\n Math.abs(this.b - that.b) < precision &&\n Math.abs(this.c - that.c) < precision &&\n Math.abs(this.d - that.d) < precision &&\n Math.abs(this.e - that.e) < precision &&\n Math.abs(this.f - that.f) < precision\n );\n};\n\n/**\n * toString\n *\n * @returns {String}\n */\nMatrix2D.prototype.toString = function() {\n return \"matrix(\" + [this.a, this.b, this.c, this.d, this.e, this.f].join(\",\") + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Matrix2D;\n}\n","// expose classes\n\nexports.Point2D = require('./lib/Point2D');\nexports.Vector2D = require('./lib/Vector2D');\nexports.Matrix2D = require('./lib/Matrix2D');\n","/**\n *\n * Polynomial.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n * \n * contribution {@link http://github.com/Quazistax/kld-polynomial}\n * @copyright 2015 Robert Benko (Quazistax) \n * @license MIT\n */\n\nPolynomial.TOLERANCE = 1e-6;\nPolynomial.ACCURACY = 15;\n\n\n/**\n * interpolate\n *\n * Based on poloint in \"Numerical Recipes in C, 2nd Edition\", pages 109-110\n *\n * @param {Array} xs\n * @param {Array} ys\n * @param {Number} n\n * @param {Number} offset\n * @param {Number} x\n *\n * @returns {{y: Number, dy: Number}}\n */\nPolynomial.interpolate = function(xs, ys, n, offset, x) {\n if ( xs.constructor !== Array || ys.constructor !== Array ) {\n throw new Error(\"Polynomial.interpolate: xs and ys must be arrays\");\n }\n if ( isNaN(n) || isNaN(offset) || isNaN(x) ) {\n throw new Error(\"Polynomial.interpolate: n, offset, and x must be numbers\");\n }\n\n var y = 0;\n var dy = 0;\n var c = new Array(n);\n var d = new Array(n);\n var ns = 0;\n\n var diff = Math.abs(x - xs[offset]);\n\n for ( var i = 0; i < n; i++ ) {\n var dift = Math.abs(x - xs[offset+i]);\n\n if ( dift < diff ) {\n ns = i;\n diff = dift;\n }\n c[i] = d[i] = ys[offset+i];\n }\n\n y = ys[offset+ns];\n ns--;\n\n for ( var m = 1; m < n; m++ ) {\n for ( var i = 0; i < n-m; i++ ) {\n var ho = xs[offset+i] - x;\n var hp = xs[offset+i+m] - x;\n var w = c[i+1]-d[i];\n var den = ho - hp;\n\n if ( den == 0.0 ) {\n throw new Error(\"Unable to interpolate polynomial. Two numbers in n were identical (to within roundoff)\");\n }\n\n den = w / den;\n d[i] = hp*den;\n c[i] = ho*den;\n }\n\n dy = (2*(ns+1) < (n-m)) ? c[ns+1] : d[ns--];\n y += dy;\n }\n\n return { y: y, dy: dy };\n};\n\n\n/**\n * Polynomial\n *\n * @returns {Polynomial}\n */\nfunction Polynomial() {\n this.init( arguments );\n}\n\n\n/**\n * init\n */\nPolynomial.prototype.init = function(coefs) {\n this.coefs = new Array();\n\n for ( var i = coefs.length - 1; i >= 0; i-- )\n this.coefs.push( coefs[i] );\n\n this._variable = \"t\";\n this._s = 0;\n};\n\n\n/**\n * eval\n */\nPolynomial.prototype.eval = function(x) {\n if ( isNaN(x) ) {\n throw new Error(\"Polynomial.eval: parameter must be a number\");\n }\n\n var result = 0;\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n result = result * x + this.coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * add\n */\nPolynomial.prototype.add = function(that) {\n var result = new Polynomial();\n var d1 = this.getDegree();\n var d2 = that.getDegree();\n var dmax = Math.max(d1,d2);\n\n for ( var i = 0; i <= dmax; i++ ) {\n var v1 = (i <= d1) ? this.coefs[i] : 0;\n var v2 = (i <= d2) ? that.coefs[i] : 0;\n\n result.coefs[i] = v1 + v2;\n }\n\n return result;\n};\n\n\n/**\n * multiply\n */\nPolynomial.prototype.multiply = function(that) {\n var result = new Polynomial();\n\n for ( var i = 0; i <= this.getDegree() + that.getDegree(); i++ ) {\n result.coefs.push(0);\n }\n\n for ( var i = 0; i <= this.getDegree(); i++ ) {\n for ( var j = 0; j <= that.getDegree(); j++ ) {\n result.coefs[i+j] += this.coefs[i] * that.coefs[j];\n }\n }\n\n return result;\n};\n\n\n/**\n * divide_scalar\n */\nPolynomial.prototype.divide_scalar = function(scalar) {\n for ( var i = 0; i < this.coefs.length; i++ ) {\n this.coefs[i] /= scalar;\n }\n};\n\n\n/**\n * simplify\n */\nPolynomial.prototype.simplify = function(TOLERANCE) {\n if (TOLERANCE === undefined) TOLERANCE = 1e-12;\n\n for ( var i = this.getDegree(); i >= 0; i-- ) {\n if ( Math.abs( this.coefs[i] ) <= TOLERANCE ) {\n this.coefs.pop();\n }\n else {\n break;\n }\n }\n};\n\n\n/**\n * bisection\n */\nPolynomial.prototype.bisection = function(min, max) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n var result;\n\n if ( Math.abs(minValue) <= Polynomial.TOLERANCE ) {\n result = min;\n }\n else if ( Math.abs(maxValue) <= Polynomial.TOLERANCE ) {\n result = max;\n }\n else if ( minValue * maxValue <= 0 ) {\n var tmp1 = Math.log(max - min);\n var tmp2 = Math.LN10 * Polynomial.ACCURACY;\n var iters = Math.ceil( (tmp1+tmp2) / Math.LN2 );\n\n for ( var i = 0; i < iters; i++ ) {\n result = 0.5 * (min + max);\n var value = this.eval(result);\n\n if ( Math.abs(value) <= Polynomial.TOLERANCE ) {\n break;\n }\n\n if ( value * minValue < 0 ) {\n max = result;\n maxValue = value;\n }\n else {\n min = result;\n minValue = value;\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * toString\n */\nPolynomial.prototype.toString = function() {\n var coefs = new Array();\n var signs = new Array();\n\n for ( var i = this.coefs.length - 1; i >= 0; i-- ) {\n var value = Math.round(this.coefs[i]*1000)/1000;\n //var value = this.coefs[i];\n\n if ( value != 0 ) {\n var sign = ( value < 0 ) ? \" - \" : \" + \";\n\n value = Math.abs(value);\n\n if ( i > 0 ) {\n if ( value == 1 ) {\n value = this._variable;\n }\n else {\n value += this._variable;\n }\n }\n\n if ( i > 1 ) {\n value += \"^\" + i;\n }\n\n signs.push( sign );\n coefs.push( value );\n }\n }\n\n signs[0] = ( signs[0] == \" + \" ) ? \"\" : \"-\";\n\n var result = \"\";\n\n for ( var i = 0; i < coefs.length; i++ ) {\n result += signs[i] + coefs[i];\n }\n\n return result;\n};\n\n\n/**\n * trapezoid\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 137\n */\nPolynomial.prototype.trapezoid = function(min, max, n) {\n if ( isNaN(min) || isNaN(max) || isNaN(n) ) {\n throw new Error(\"Polynomial.trapezoid: parameters must be numbers\");\n }\n\n var range = max - min;\n var TOLERANCE = 1e-7;\n\n if ( n == 1 ) {\n var minValue = this.eval(min);\n var maxValue = this.eval(max);\n\n this._s = 0.5*range*( minValue + maxValue );\n }\n else {\n var it = 1 << (n-2);\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 0; i < it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n this._s = 0.5*(this._s + range*sum/it);\n }\n\n if ( isNaN(this._s) ) {\n throw new Error(\"Polynomial.trapezoid: this._s is NaN\");\n }\n\n return this._s;\n};\n\n\n/**\n * simpson\n *\n * Based on trapzd in \"Numerical Recipes in C, 2nd Edition\", page 139\n */\nPolynomial.prototype.simpson = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.simpson: parameters must be numbers\");\n }\n\n var range = max - min;\n var st = 0.5 * range * ( this.eval(min) + this.eval(max) );\n var t = st;\n var s = 4.0*st/3.0;\n var os = s;\n var ost = st;\n var TOLERANCE = 1e-7;\n\n var it = 1;\n\n for ( var n = 2; n <= 20; n++ ) {\n var delta = range / it;\n var x = min + 0.5*delta;\n var sum = 0;\n\n for ( var i = 1; i <= it; i++ ) {\n sum += this.eval(x);\n x += delta;\n }\n\n t = 0.5 * (t + range * sum / it);\n st = t;\n s = (4.0*st - ost)/3.0;\n\n if ( Math.abs(s-os) < TOLERANCE*Math.abs(os) ) {\n break;\n }\n\n os = s;\n ost = st;\n it <<= 1;\n }\n\n return s;\n};\n\n\n/**\n * romberg\n */\nPolynomial.prototype.romberg = function(min, max) {\n if ( isNaN(min) || isNaN(max) ) {\n throw new Error(\"Polynomial.romberg: parameters must be numbers\");\n }\n\n var MAX = 20;\n var K = 3;\n var TOLERANCE = 1e-6;\n var s = new Array(MAX+1);\n var h = new Array(MAX+1);\n var result = { y: 0, dy: 0 };\n\n h[0] = 1.0;\n\n for ( var j = 1; j <= MAX; j++ ) {\n s[j-1] = this.trapezoid(min, max, j);\n\n if ( j >= K ) {\n result = Polynomial.interpolate(h, s, K, j-K, 0.0);\n if ( Math.abs(result.dy) <= TOLERANCE*result.y) break;\n }\n\n s[j] = s[j-1];\n h[j] = 0.25 * h[j-1];\n }\n\n return result.y;\n};\n\n// getters and setters\n\n/**\n * get degree\n */\nPolynomial.prototype.getDegree = function() {\n return this.coefs.length - 1;\n};\n\n\n/**\n * getDerivative\n */\nPolynomial.prototype.getDerivative = function() {\n var derivative = new Polynomial();\n\n for ( var i = 1; i < this.coefs.length; i++ ) {\n derivative.coefs.push(i*this.coefs[i]);\n }\n\n return derivative;\n};\n\n\n/**\n * getRoots\n */\nPolynomial.prototype.getRoots = function() {\n var result;\n\n this.simplify();\n\n switch ( this.getDegree() ) {\n case 0: result = []; break;\n case 1: result = this.getLinearRoot(); break;\n case 2: result = this.getQuadraticRoots(); break;\n case 3: result = this.getCubicRoots(); break;\n case 4: result = this.getQuarticRoots(); break;\n default:\n result = [];\n }\n\n return result;\n};\n\n\n/**\n * getRootsInInterval\n */\nPolynomial.prototype.getRootsInInterval = function(min, max) {\n var roots = new Array();\n var root;\n\n if ( this.getDegree() == 1 ) {\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // get roots of derivative\n var deriv = this.getDerivative();\n var droots = deriv.getRootsInInterval(min, max);\n\n if ( droots.length > 0 ) {\n // find root on [min, droots[0]]\n root = this.bisection(min, droots[0]);\n\n if ( root != null ) {\n roots.push(root);\n }\n\n // find root on [droots[i],droots[i+1]] for 0 <= i <= count-2\n for ( i = 0; i <= droots.length-2; i++ ) {\n root = this.bisection(droots[i], droots[i+1]);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n\n // find root on [droots[count-1],xmax]\n root = this.bisection(droots[droots.length-1], max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n else {\n // polynomial is monotone on [min,max], has at most one root\n root = this.bisection(min, max);\n\n if ( root != null ) {\n roots.push(root);\n }\n }\n }\n\n return roots;\n};\n\n\n/**\n * getLinearRoot\n */\nPolynomial.prototype.getLinearRoot = function() {\n var result = [];\n var a = this.coefs[1];\n\n if ( a != 0 ) {\n result.push( -this.coefs[0] / a );\n }\n\n return result;\n};\n\n\n/**\n * getQuadraticRoots\n */\nPolynomial.prototype.getQuadraticRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 2 ) {\n var a = this.coefs[2];\n var b = this.coefs[1] / a;\n var c = this.coefs[0] / a;\n var d = b*b - 4*c;\n\n if ( d > 0 ) {\n var e = Math.sqrt(d);\n\n results.push( 0.5 * (-b + e) );\n results.push( 0.5 * (-b - e) );\n }\n else if ( d == 0 ) {\n // really two roots with same value, but we only return one\n results.push( 0.5 * -b );\n }\n }\n\n return results;\n};\n\n\n/**\n * getCubicRoots\n *\n * This code is based on MgcPolynomial.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.geometrictools.com\n */\nPolynomial.prototype.getCubicRoots = function() {\n var results = [];\n\n if ( this.getDegree() == 3 ) {\n var c3 = this.coefs[3];\n var c2 = this.coefs[2] / c3;\n var c1 = this.coefs[1] / c3;\n var c0 = this.coefs[0] / c3;\n\n var a = (3*c1 - c2*c2) / 3;\n var b = (2*c2*c2*c2 - 9*c1*c2 + 27*c0) / 27;\n var offset = c2 / 3;\n var discrim = b*b/4 + a*a*a/27;\n var halfB = b / 2;\n\n var ZEROepsilon = this.zeroErrorEstimate();\n if (Math.abs(discrim) <= ZEROepsilon) {\n discrim = 0;\n }\n\n if ( discrim > 0 ) {\n var e = Math.sqrt(discrim);\n var tmp;\n var root;\n\n tmp = -halfB + e;\n\n if ( tmp >= 0 ) {\n root = Math.pow(tmp, 1/3);\n }\n else {\n root = -Math.pow(-tmp, 1/3);\n }\n\n tmp = -halfB - e;\n\n if ( tmp >= 0 ) {\n root += Math.pow(tmp, 1/3);\n }\n else {\n root -= Math.pow(-tmp, 1/3);\n }\n\n results.push( root - offset );\n }\n else if ( discrim < 0 ) {\n var distance = Math.sqrt(-a/3);\n var angle = Math.atan2( Math.sqrt(-discrim), -halfB) / 3;\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var sqrt3 = Math.sqrt(3);\n\n results.push( 2*distance*cos - offset );\n results.push( -distance * (cos + sqrt3 * sin) - offset);\n results.push( -distance * (cos - sqrt3 * sin) - offset);\n }\n else {\n var tmp;\n\n if ( halfB >= 0 ) {\n tmp = -Math.pow(halfB, 1/3);\n }\n else {\n tmp = Math.pow(-halfB, 1/3);\n }\n\n results.push( 2*tmp - offset );\n // really should return next root twice, but we return only one\n results.push( -tmp - offset );\n }\n }\n\n return results;\n};\n\n\n/**\n * Sign of a number (+1, -1, +0, -0).\n */\nvar sign = function (x) {\n return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;\n};\n\n\n/**\n * Calculates roots of quartic polynomial.
\n * First, derivative roots are found, then used to split quartic polynomial \n * into segments, each containing one root of quartic polynomial.\n * Segments are then passed to newton's method to find roots.\n *\n * @returns {Array} roots\n */\nPolynomial.prototype.getQuarticRoots = function () {\n var results = [];\n\n var n = this.getDegree();\n\n if (n == 4) {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice();\n poly.divide_scalar(poly.coefs[n]);\n\n var ERRF = 1e-15;\n\n if (Math.abs(poly.coefs[0]) < 10 * ERRF * Math.abs(poly.coefs[3])) {\n poly.coefs[0] = 0;\n }\n\n var poly_d = poly.getDerivative();\n var derrt = poly_d.getRoots().sort(function (a, b) { return a - b; });\n var dery = [];\n var nr = derrt.length - 1;\n var i;\n var rb = this.bounds();\n\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n\n var ZEROepsilon = this.zeroErrorEstimate(maxabsX);\n \n for (i = 0; i <= nr; i++) {\n dery.push(poly.eval(derrt[i]));\n }\n\n for (i = 0; i <= nr; i++) {\n if (Math.abs(dery[i]) < ZEROepsilon) {\n dery[i] = 0;\n }\n }\n\n i = 0;\n var dx = Math.max(0.1 * (rb.maxX - rb.minX) / n, ERRF);\n var guesses = [];\n var minmax = [];\n\n if (nr > -1) {\n if (dery[0] != 0) {\n if (sign(dery[0]) != sign(poly.eval(derrt[0] - dx) - dery[0])) {\n guesses.push(derrt[0] - dx);\n minmax.push([rb.minX, derrt[0]]);\n }\n }\n else {\n results.push(derrt[0], derrt[0]);\n i++;\n }\n\n for (; i < nr; i++) {\n if (dery[i + 1] == 0) {\n results.push(derrt[i + 1], derrt[i + 1]);\n i++;\n }\n else if (sign(dery[i]) != sign(dery[i + 1])) {\n guesses.push((derrt[i] + derrt[i + 1]) / 2);\n minmax.push([derrt[i], derrt[i + 1]]);\n }\n }\n if (dery[nr] != 0 && sign(dery[nr]) != sign(poly.eval(derrt[nr] + dx) - dery[nr])) {\n guesses.push(derrt[nr] + dx);\n minmax.push([derrt[nr], rb.maxX]);\n }\n }\n\n var f = function (x) { return poly.eval(x); };\n var df = function (x) { return poly_d.eval(x); };\n\n if (guesses.length > 0) {\n for (i = 0; i < guesses.length; i++) {\n guesses[i] = Polynomial.newton_secant_bisection(guesses[i], f, df, 32, minmax[i][0], minmax[i][1]);\n }\n }\n\n results = results.concat(guesses);\n }\n\n return results;\n};\n\n\n/**\n * Estimate what is the maximum polynomial evaluation error value under which polynomial evaluation could be in fact 0.\n * \n * @returns {Number} \n */\nPolynomial.prototype.zeroErrorEstimate = function (maxabsX) {\n var poly = this;\n var ERRF = 1e-15;\n\n if (typeof maxabsX === 'undefined') {\n var rb = poly.bounds();\n maxabsX = Math.max(Math.abs(rb.minX), Math.abs(rb.maxX));\n }\n\n if (maxabsX < 0.001) {\n return 2*Math.abs(poly.eval(ERRF));\n }\n\n var n = poly.coefs.length - 1;\n var an = poly.coefs[n];\n\n return 10 * ERRF * poly.coefs.reduce(function (m, v, i) {\n var nm = v / an * Math.pow(maxabsX, i);\n return nm > m ? nm : m;\n }, 0);\n}\n\n\n/**\n * Calculates upper Real roots bounds.
\n * Real roots are in interval [negX, posX]. Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_UpperReal_Fujiwara = function () {\n var a = this.coefs;\n var n = a.length - 1;\n var an = a[n];\n\n if (an != 1) {\n a = this.coefs.map(function (v) {\n return v / an;\n });\n }\n\n var b = a.map(function (v, i) {\n return (i < n)\n ? Math.pow(Math.abs((i == 0) ? v / 2 : v), 1 / (n - i))\n : v;\n });\n\n var coefSelectionFunc;\n var find2Max = function (acc, bi, i) {\n if (coefSelectionFunc(i)) {\n if (acc.max < bi) {\n acc.nearmax = acc.max;\n acc.max = bi;\n }\n else if (acc.nearmax < bi) {\n acc.nearmax = bi;\n }\n }\n return acc;\n };\n\n coefSelectionFunc = function (i) { return i < n && a[i] < 0; };\n var max_nearmax_pos = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n coefSelectionFunc = function (i) { return i < n && ((n % 2 == i % 2) ? a[i] < 0 : a[i] > 0); };\n var max_nearmax_neg = b.reduce(find2Max, { max: 0, nearmax: 0 });\n\n return {\n negX: -2 * max_nearmax_neg.max,\n posX: 2 * max_nearmax_pos.max\n };\n};\n\n\n/** \n * Calculates lower Real roots bounds.
\n * There are no Real roots in interval . Determined by Fujiwara method.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ negX: Number, posX: Number }}\n */\nPolynomial.prototype.bounds_LowerReal_Fujiwara = function () {\n var poly = new Polynomial();\n\n poly.coefs = this.coefs.slice().reverse();\n\n var res = poly.bounds_UpperReal_Fujiwara();\n\n res.negX = 1 / res.negX;\n res.posX = 1 / res.posX;\n\n return res;\n};\n\n\n/** \n * Calculates left and right Real roots bounds.
\n * Real roots are in interval [minX, maxX]. Combines Fujiwara lower and upper bounds to get minimal interval.\n * @see {@link http://en.wikipedia.org/wiki/Properties_of_polynomial_roots}\n *\n * @returns {{ minX: Number, maxX: Number }}\n*/\nPolynomial.prototype.bounds = function () {\n var urb = this.bounds_UpperReal_Fujiwara();\n var rb = { minX: urb.negX, maxX: urb.posX };\n\n if (urb.negX === 0 && urb.posX === 0) {\n return rb;\n }\n\n if (urb.negX === 0) {\n rb.minX = this.bounds_LowerReal_Fujiwara().posX;\n }\n else if (urb.posX === 0) {\n rb.maxX = this.bounds_LowerReal_Fujiwara().negX;\n }\n\n if (rb.minX > rb.maxX) {\n //console.log('Polynomial.prototype.bounds: poly has no real roots? or floating point error?');\n rb.minX = rb.maxX = 0;\n }\n\n return rb;\n // TODO: if sure that there are no complex roots \n // (maybe by using Sturm's theorem) use:\n // return this.bounds_Real_Laguerre();\n};\n\n\n/**\n * Newton's (Newton-Raphson) method for finding Real roots on univariate function.
\n * When using bounds, algorithm falls back to secant if newton goes out of range.\n * Bisection is fallback for secant when determined secant is not efficient enough.\n * @see {@link http://en.wikipedia.org/wiki/Newton%27s_method}\n * @see {@link http://en.wikipedia.org/wiki/Secant_method}\n * @see {@link http://en.wikipedia.org/wiki/Bisection_method}\n *\n * @param {Number} x0 - Inital root guess\n * @param {function(x)} f - Function which root we are trying to find\n * @param {function(x)} df - Derivative of function f\n * @param {Number} max_iterations - Maximum number of algorithm iterations\n * @param {Number} [min_x] - Left bound value\n * @param {Number} [max_x] - Right bound value\n * @returns {Number} - root\n */\nPolynomial.newton_secant_bisection = function (x0, f, df, max_iterations, min, max) {\n var x, prev_dfx = 0, dfx, prev_x_ef_correction = 0, x_correction, x_new;\n var v, y_atmin, y_atmax;\n\n x = x0;\n\n var ACCURACY = 14;\n var min_correction_factor = Math.pow(10, -ACCURACY);\n var isBounded = (typeof min === 'number' && typeof max === 'number');\n\n if (isBounded) {\n if (min > max) {\n throw new Error(\"newton root finding: min must be greater than max\");\n }\n\n y_atmin = f(min);\n y_atmax = f(max);\n\n if (sign(y_atmin) == sign(y_atmax)) {\n throw new Error(\"newton root finding: y values of bounds must be of opposite sign\");\n }\n }\n\n var isEnoughCorrection = function () {\n // stop if correction is too small or if correction is in simple loop\n return (Math.abs(x_correction) <= min_correction_factor * Math.abs(x))\n || (prev_x_ef_correction == (x - x_correction) - x);\n };\n\n var i;\n\n for (i = 0; i < max_iterations; i++) {\n dfx = df(x);\n\n if (dfx == 0) {\n if (prev_dfx == 0) {\n // error\n throw new Error(\"newton root finding: df(x) is zero\");\n }\n else {\n // use previous derivation value\n dfx = prev_dfx;\n }\n // or move x a little?\n //dfx = df(x != 0 ? x + x * 1e-15 : 1e-15);\n }\n\n prev_dfx = dfx;\n y = f(x);\n x_correction = y / dfx;\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n\n if (isBounded) {\n if (sign(y) == sign(y_atmax)) {\n max = x;\n y_atmax = y;\n }\n else if (sign(y) == sign(y_atmin)) {\n min = x;\n y_atmin = y;\n }\n else {\n x = x_new;\n break;\n }\n\n if ((x_new < min) || (x_new > max)) {\n if (sign(y_atmin) == sign(y_atmax)) {\n break;\n }\n\n var RATIO_LIMIT = 50;\n var AIMED_BISECT_OFFSET = 0.25; // [0, 0.5)\n var dy = y_atmax - y_atmin;\n var dx = max - min;\n\n if (dy == 0) {\n x_correction = x - (min + dx * 0.5);\n }\n else if (Math.abs(dy / Math.min(y_atmin, y_atmax)) > RATIO_LIMIT) {\n x_correction = x - (min + dx * (0.5 + (Math.abs(y_atmin) < Math.abs(y_atmax) ? -AIMED_BISECT_OFFSET : AIMED_BISECT_OFFSET)));\n }\n else {\n x_correction = x - (min - y_atmin / dy * dx);\n }\n x_new = x - x_correction;\n\n if (isEnoughCorrection()) {\n break;\n }\n }\n }\n\n prev_x_ef_correction = x - x_new;\n x = x_new;\n }\n\n return x;\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = Polynomial;\n}\n","/**\n *\n * SqrtPolynomial.js\n *\n * copyright 2003, 2013 Kevin Lindsey\n *\n */\n\nif (typeof module !== \"undefined\") {\n var Polynomial = require(\"./Polynomial\");\n}\n\n/**\n * class variables\n */\nSqrtPolynomial.VERSION = 1.0;\n\n// setup inheritance\nSqrtPolynomial.prototype = new Polynomial();\nSqrtPolynomial.prototype.constructor = SqrtPolynomial;\nSqrtPolynomial.superclass = Polynomial.prototype;\n\n\n/**\n * SqrtPolynomial\n */\nfunction SqrtPolynomial() {\n this.init( arguments );\n}\n\n\n/**\n * eval\n *\n * @param {Number} x\n * @returns {Number}\n */\nSqrtPolynomial.prototype.eval = function(x) {\n var TOLERANCE = 1e-7;\n var result = SqrtPolynomial.superclass.eval.call(this, x);\n\n // NOTE: May need to change the following. I added these to capture\n // some really small negative values that were being generated by one\n // of my Bezier arcLength functions\n if ( Math.abs(result) < TOLERANCE ) result = 0;\n if ( result < 0 )\n throw new Error(\"SqrtPolynomial.eval: cannot take square root of negative number\");\n\n return Math.sqrt(result);\n};\n\nSqrtPolynomial.prototype.toString = function() {\n var result = SqrtPolynomial.superclass.toString.call(this);\n\n return \"sqrt(\" + result + \")\";\n};\n\nif (typeof module !== \"undefined\") {\n module.exports = SqrtPolynomial;\n}\n","// expose classes\n\nexports.Polynomial = require('./lib/Polynomial');\nexports.SqrtPolynomial = require('./lib/SqrtPolynomial');\n","/* eslint-disable camelcase, eqeqeq, no-labels, space-infix-ops */\n/**\n *\n * Intersection.js\n *\n * copyright 2002, 2013 Kevin Lindsey\n */\n\nimport {Point2D, Vector2D} from \"kld-affine\";\nimport {Polynomial} from \"kld-polynomial\";\n\n/**\n * @memberof module:kld-intersections.Intersection~\n * @param {*} o\n * @returns {boolean}\n */\nfunction isNullish(o) {\n return o === null || o === undefined;\n}\n\n/**\n * closePolygon\n * @memberof module:kld-intersections.Intersection~\n * @param {Array} points\n * @returns {Array}\n */\nfunction closePolygon(points) {\n const copy = points.slice();\n\n copy.push(points[0]);\n\n return copy;\n}\n\n\n/**\n * Intersection\n * @memberof module:kld-intersections\n */\nclass Intersection {\n /**\n * @param {string} status\n * @returns {module:kld-intersections.Intersection}\n */\n constructor(status) {\n this.init(status);\n }\n\n\n /**\n * init\n *\n * @param {string} status\n * @returns {module:kld-intersections.Intersection}\n */\n init(status) {\n this.status = status;\n this.points = [];\n }\n\n\n /**\n * appendPoint\n *\n * @param {module:kld-intersections.Point2D} point\n */\n appendPoint(point) {\n this.points.push(point);\n }\n\n\n /**\n * appendPoints\n *\n * @param {Array} points\n */\n appendPoints(points) {\n this.points = this.points.concat(points);\n }\n}\n\n// static methods\n\n/**\n * intersect\n *\n * @param {module:kld-intersections.IntersectionArgs} shape1\n * @param {module:kld-intersections.IntersectionArgs} shape2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersect = function(shape1, shape2) {\n let result;\n\n if (!isNullish(shape1) && !isNullish(shape2)) {\n if (shape1.name === \"Path\") {\n result = Intersection.intersectPathShape(shape1, shape2);\n }\n else if (shape2.name === \"Path\") {\n result = Intersection.intersectPathShape(shape2, shape1);\n }\n else {\n let method;\n let args;\n\n if (shape1.name < shape2.name) {\n method = \"intersect\" + shape1.name + shape2.name;\n args = shape1.args.concat(shape2.args);\n }\n else {\n method = \"intersect\" + shape2.name + shape1.name;\n args = shape2.args.concat(shape1.args);\n }\n\n if (!(method in Intersection)) {\n throw new Error(\"Intersection not available: \" + method);\n }\n\n result = Intersection[method].apply(null, args);\n }\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n\n return result;\n};\n\n\n/**\n * intersectPathShape\n *\n * @param {module:kld-intersections.IntersectionArgs} path\n * @param {module:kld-intersections.IntersectionArgs} shape\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPathShape = function(path, shape) {\n const result = new Intersection(\"No Intersection\");\n\n for (const segment of path.args) {\n const inter = Intersection.intersect(segment, shape);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier2\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} a3\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @param {module:kld-intersections.Point2D} b3\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) {\n let a, b;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b2.multiply(-2);\n const c22 = b1.add(a.add(b3));\n\n a = b1.multiply(-2);\n b = b2.multiply(2);\n const c21 = a.add(b);\n\n const c20 = new Point2D(b1.x, b1.y);\n\n // bezout\n a = c12.x*c11.y - c11.x*c12.y;\n b = c22.x*c11.y - c11.x*c22.y;\n const c = c21.x*c11.y - c11.x*c21.y;\n const d = c11.x*(c10.y - c20.y) + c11.y*(-c10.x + c20.x);\n const e = c22.x*c12.y - c12.x*c22.y;\n const f = c21.x*c12.y - c12.x*c21.y;\n const g = c12.x*(c10.y - c20.y) + c12.y*(-c10.x + c20.x);\n\n // determinant\n const poly = new Polynomial(\n -e*e,\n -2*e*f,\n a*b - f*f - 2*e*g,\n a*c - 2*f*g,\n a*d - g*g\n );\n\n const roots = poly.getRoots();\n\n for (const s of roots) {\n if (0 <= s && s <= 1) {\n const xp = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(c22.multiply(s*s).add(c21.multiply(s).add(c20)));\n break checkRoots;\n }\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Bezier3\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} a3\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @param {module:kld-intersections.Point2D} b3\n * @param {module:kld-intersections.Point2D} b4\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) {\n let a, b, c, d;\n const result = new Intersection(\"No Intersection\");\n\n a = a2.multiply(-2);\n const c12 = a1.add(a.add(a3));\n\n a = a1.multiply(-2);\n b = a2.multiply(2);\n const c11 = a.add(b);\n\n const c10 = new Point2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n const c10x2 = c10.x*c10.x;\n const c10y2 = c10.y*c10.y;\n const c11x2 = c11.x*c11.x;\n const c11y2 = c11.y*c11.y;\n const c12x2 = c12.x*c12.x;\n const c12y2 = c12.y*c12.y;\n const c20x2 = c20.x*c20.x;\n const c20y2 = c20.y*c20.y;\n const c21x2 = c21.x*c21.x;\n const c21y2 = c21.y*c21.y;\n const c22x2 = c22.x*c22.x;\n const c22y2 = c22.y*c22.y;\n const c23x2 = c23.x*c23.x;\n const c23y2 = c23.y*c23.y;\n\n const poly = new Polynomial(\n -2*c12.x*c12.y*c23.x*c23.y + c12x2*c23y2 + c12y2*c23x2,\n -2*c12.x*c12.y*c22.x*c23.y - 2*c12.x*c12.y*c22.y*c23.x + 2*c12y2*c22.x*c23.x +\n 2*c12x2*c22.y*c23.y,\n -2*c12.x*c21.x*c12.y*c23.y - 2*c12.x*c12.y*c21.y*c23.x - 2*c12.x*c12.y*c22.x*c22.y +\n 2*c21.x*c12y2*c23.x + c12y2*c22x2 + c12x2*(2*c21.y*c23.y + c22y2),\n 2*c10.x*c12.x*c12.y*c23.y + 2*c10.y*c12.x*c12.y*c23.x + c11.x*c11.y*c12.x*c23.y +\n c11.x*c11.y*c12.y*c23.x - 2*c20.x*c12.x*c12.y*c23.y - 2*c12.x*c20.y*c12.y*c23.x -\n 2*c12.x*c21.x*c12.y*c22.y - 2*c12.x*c12.y*c21.y*c22.x - 2*c10.x*c12y2*c23.x -\n 2*c10.y*c12x2*c23.y + 2*c20.x*c12y2*c23.x + 2*c21.x*c12y2*c22.x -\n c11y2*c12.x*c23.x - c11x2*c12.y*c23.y + c12x2*(2*c20.y*c23.y + 2*c21.y*c22.y),\n 2*c10.x*c12.x*c12.y*c22.y + 2*c10.y*c12.x*c12.y*c22.x + c11.x*c11.y*c12.x*c22.y +\n c11.x*c11.y*c12.y*c22.x - 2*c20.x*c12.x*c12.y*c22.y - 2*c12.x*c20.y*c12.y*c22.x -\n 2*c12.x*c21.x*c12.y*c21.y - 2*c10.x*c12y2*c22.x - 2*c10.y*c12x2*c22.y +\n 2*c20.x*c12y2*c22.x - c11y2*c12.x*c22.x - c11x2*c12.y*c22.y + c21x2*c12y2 +\n c12x2*(2*c20.y*c22.y + c21y2),\n 2*c10.x*c12.x*c12.y*c21.y + 2*c10.y*c12.x*c21.x*c12.y + c11.x*c11.y*c12.x*c21.y +\n c11.x*c11.y*c21.x*c12.y - 2*c20.x*c12.x*c12.y*c21.y - 2*c12.x*c20.y*c21.x*c12.y -\n 2*c10.x*c21.x*c12y2 - 2*c10.y*c12x2*c21.y + 2*c20.x*c21.x*c12y2 -\n c11y2*c12.x*c21.x - c11x2*c12.y*c21.y + 2*c12x2*c20.y*c21.y,\n -2*c10.x*c10.y*c12.x*c12.y - c10.x*c11.x*c11.y*c12.y - c10.y*c11.x*c11.y*c12.x +\n 2*c10.x*c12.x*c20.y*c12.y + 2*c10.y*c20.x*c12.x*c12.y + c11.x*c20.x*c11.y*c12.y +\n c11.x*c11.y*c12.x*c20.y - 2*c20.x*c12.x*c20.y*c12.y - 2*c10.x*c20.x*c12y2 +\n c10.x*c11y2*c12.x + c10.y*c11x2*c12.y - 2*c10.y*c12x2*c20.y -\n c20.x*c11y2*c12.x - c11x2*c20.y*c12.y + c10x2*c12y2 + c10y2*c12x2 +\n c20x2*c12y2 + c12x2*c20y2\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xRoots = new Polynomial(\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n ).getRoots();\n const yRoots = new Polynomial(\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n ).getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Circle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Circle = function(p1, p2, p3, c, r) {\n return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r);\n};\n\n\n/**\n * intersectBezier2Ellipse\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) {\n let a; // temporary variables\n // c2, c1, c0; // coefficients of quadratic\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const roots = new Polynomial(\n ryry*c2.x*c2.x + rxrx*c2.y*c2.y,\n 2*(ryry*c2.x*c1.x + rxrx*c2.y*c1.y),\n ryry*(2*c2.x*c0.x + c1.x*c1.x) + rxrx*(2*c2.y*c0.y+c1.y*c1.y) -\n 2*(ryry*ec.x*c2.x + rxrx*ec.y*c2.y),\n 2*(ryry*c1.x*(c0.x-ec.x) + rxrx*c1.y*(c0.y-ec.y)),\n ryry*(c0.x*c0.x+ec.x*ec.x) + rxrx*(c0.y*c0.y + ec.y*ec.y) -\n 2*(ryry*ec.x*c0.x + rxrx*ec.y*c0.y) - rxrx*ryry\n ).getRoots();\n\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n result.points.push(c2.multiply(t*t).add(c1.multiply(t).add(c0)));\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Line\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) {\n let a; // temporary variables\n // let c2, c1, c0; // coefficients of quadratic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n a = p2.multiply(-2);\n const c2 = p1.add(a.add(p3));\n\n a = p1.multiply(-2);\n const b = p2.multiply(2);\n const c1 = a.add(b);\n\n const c0 = new Point2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // Transform cubic coefficients to line's coordinate system and find roots\n // of cubic\n const roots = new Polynomial(\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p4 = p1.lerp(p2, t);\n const p5 = p2.lerp(p3, t);\n\n const p6 = p4.lerp(p5, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p6\n if (a1.x == a2.x) {\n if (min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p6.x && p6.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n else if (min.x <= p6.x && p6.x <= max.x && min.y <= p6.y && p6.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p6);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Polygon\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Polygon = function(p1, p2, p3, points) {\n return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points));\n};\n\n\n/**\n * intersectBezier2Polyline\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Polyline = function(p1, p2, p3, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier2Line(p1, p2, p3, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier2Rectangle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier2Line(p1, p2, p3, min, topRight);\n const inter2 = Intersection.intersectBezier2Line(p1, p2, p3, topRight, max);\n const inter3 = Intersection.intersectBezier2Line(p1, p2, p3, max, bottomLeft);\n const inter4 = Intersection.intersectBezier2Line(p1, p2, p3, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Bezier3\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} a3\n * @param {module:kld-intersections.Point2D} a4\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @param {module:kld-intersections.Point2D} b3\n * @param {module:kld-intersections.Point2D} b4\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) {\n let a, b, c, d; // temporary variables\n // c13, c12, c11, c10; // coefficients of cubic\n // c23, c22, c21, c20; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = a1.multiply(-1);\n b = a2.multiply(3);\n c = a3.multiply(-3);\n d = a.add(b.add(c.add(a4)));\n const c13 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(3);\n b = a2.multiply(-6);\n c = a3.multiply(3);\n d = a.add(b.add(c));\n const c12 = new Vector2D(d.x, d.y);\n\n a = a1.multiply(-3);\n b = a2.multiply(3);\n c = a.add(b);\n const c11 = new Vector2D(c.x, c.y);\n\n const c10 = new Vector2D(a1.x, a1.y);\n\n a = b1.multiply(-1);\n b = b2.multiply(3);\n c = b3.multiply(-3);\n d = a.add(b.add(c.add(b4)));\n const c23 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(3);\n b = b2.multiply(-6);\n c = b3.multiply(3);\n d = a.add(b.add(c));\n const c22 = new Vector2D(d.x, d.y);\n\n a = b1.multiply(-3);\n b = b2.multiply(3);\n c = a.add(b);\n const c21 = new Vector2D(c.x, c.y);\n\n const c20 = new Vector2D(b1.x, b1.y);\n\n // bezout\n a = c13.x * c12.y - c12.x * c13.y;\n b = c13.x * c11.y - c11.x * c13.y;\n const c0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const c1 = c21.x * c13.y - c13.x * c21.y;\n const c2 = c22.x * c13.y - c13.x * c22.y;\n const c3 = c23.x * c13.y - c13.x * c23.y;\n d = c13.x * c11.y - c11.x * c13.y;\n const e0 = c13.x * c10.y + c12.x * c11.y - c11.x * c12.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const e1 = c21.x * c13.y - c13.x * c21.y;\n const e2 = c22.x * c13.y - c13.x * c22.y;\n const e3 = c23.x * c13.y - c13.x * c23.y;\n const f0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const f1 = c21.x * c12.y - c12.x * c21.y;\n const f2 = c22.x * c12.y - c12.x * c22.y;\n const f3 = c23.x * c12.y - c12.x * c23.y;\n const g0 = c13.x * c10.y - c10.x * c13.y + c20.x * c13.y - c13.x * c20.y;\n const g1 = c21.x * c13.y - c13.x * c21.y;\n const g2 = c22.x * c13.y - c13.x * c22.y;\n const g3 = c23.x * c13.y - c13.x * c23.y;\n const h0 = c12.x * c10.y - c10.x * c12.y + c20.x * c12.y - c12.x * c20.y;\n const h1 = c21.x * c12.y - c12.x * c21.y;\n const h2 = c22.x * c12.y - c12.x * c22.y;\n const h3 = c23.x * c12.y - c12.x * c23.y;\n const i0 = c11.x * c10.y - c10.x * c11.y + c20.x * c11.y - c11.x * c20.y;\n const i1 = c21.x * c11.y - c11.x * c21.y;\n const i2 = c22.x * c11.y - c11.x * c22.y;\n const i3 = c23.x * c11.y - c11.x * c23.y;\n\n // determinant\n const poly = new Polynomial(\n -c3 * e3 * g3,\n -c3 * e3 * g2 - c3 * e2 * g3 - c2 * e3 * g3,\n -c3 * e3 * g1 - c3 * e2 * g2 - c2 * e3 * g2 - c3 * e1 * g3 - c2 * e2 * g3 - c1 * e3 * g3,\n -c3 * e3 * g0 - c3 * e2 * g1 - c2 * e3 * g1 - c3 * e1 * g2 - c2 * e2 * g2 - c1 * e3 * g2 - c3 * e0 * g3 - c2 * e1 * g3 - c1 * e2 * g3 - c0 * e3 * g3 + b * f3 * g3 + c3 * d * h3 - a * f3 * h3 + a * e3 * i3,\n -c3 * e2 * g0 - c2 * e3 * g0 - c3 * e1 * g1 - c2 * e2 * g1 - c1 * e3 * g1 - c3 * e0 * g2 - c2 * e1 * g2 - c1 * e2 * g2 - c0 * e3 * g2 + b * f3 * g2 - c2 * e0 * g3 - c1 * e1 * g3 - c0 * e2 * g3 + b * f2 * g3 + c3 * d * h2 - a * f3 * h2 + c2 * d * h3 - a * f2 * h3 + a * e3 * i2 + a * e2 * i3,\n -c3 * e1 * g0 - c2 * e2 * g0 - c1 * e3 * g0 - c3 * e0 * g1 - c2 * e1 * g1 - c1 * e2 * g1 - c0 * e3 * g1 + b * f3 * g1 - c2 * e0 * g2 - c1 * e1 * g2 - c0 * e2 * g2 + b * f2 * g2 - c1 * e0 * g3 - c0 * e1 * g3 + b * f1 * g3 + c3 * d * h1 - a * f3 * h1 + c2 * d * h2 - a * f2 * h2 + c1 * d * h3 - a * f1 * h3 + a * e3 * i1 + a * e2 * i2 + a * e1 * i3,\n -c3 * e0 * g0 - c2 * e1 * g0 - c1 * e2 * g0 - c0 * e3 * g0 + b * f3 * g0 - c2 * e0 * g1 - c1 * e1 * g1 - c0 * e2 * g1 + b * f2 * g1 - c1 * e0 * g2 - c0 * e1 * g2 + b * f1 * g2 - c0 * e0 * g3 + b * f0 * g3 + c3 * d * h0 - a * f3 * h0 + c2 * d * h1 - a * f2 * h1 + c1 * d * h2 - a * f1 * h2 + c0 * d * h3 - a * f0 * h3 + a * e3 * i0 + a * e2 * i1 + a * e1 * i2 - b * d * i3 + a * e0 * i3,\n -c2 * e0 * g0 - c1 * e1 * g0 - c0 * e2 * g0 + b * f2 * g0 - c1 * e0 * g1 - c0 * e1 * g1 + b * f1 * g1 - c0 * e0 * g2 + b * f0 * g2 + c2 * d * h0 - a * f2 * h0 + c1 * d * h1 - a * f1 * h1 + c0 * d * h2 - a * f0 * h2 + a * e2 * i0 + a * e1 * i1 - b * d * i2 + a * e0 * i2,\n -c1 * e0 * g0 - c0 * e1 * g0 + b * f1 * g0 - c0 * e0 * g1 + b * f0 * g1 + c1 * d * h0 - a * f1 * h0 + c0 * d * h1 - a * f0 * h1 + a * e1 * i0 - b * d * i1 + a * e0 * i1,\n -c0 * e0 * g0 + b * f0 * g0 + c0 * d * h0 - a * f0 * h0 - b * d * i0 + a * e0 * i0\n );\n poly.simplify();\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const s of roots) {\n const xp = new Polynomial(\n c13.x,\n c12.x,\n c11.x,\n c10.x - c20.x - s*c21.x - s*s*c22.x - s*s*s*c23.x\n );\n xp.simplify();\n const xRoots = xp.getRoots();\n const yp = new Polynomial(\n c13.y,\n c12.y,\n c11.y,\n c10.y - c20.y - s*c21.y - s*s*c22.y - s*s*s*c23.y\n );\n yp.simplify();\n const yRoots = yp.getRoots();\n\n if (xRoots.length > 0 && yRoots.length > 0) {\n const TOLERANCE = 1e-4;\n\n checkRoots:\n for (const xRoot of xRoots) {\n if (0 <= xRoot && xRoot <= 1) {\n for (let k = 0; k < yRoots.length; k++) {\n if (Math.abs(xRoot - yRoots[k]) < TOLERANCE) {\n result.points.push(\n c23.multiply(s*s*s).add(c22.multiply(s*s).add(c21.multiply(s).add(c20)))\n );\n break checkRoots;\n }\n }\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Circle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) {\n return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r);\n};\n\n\n/**\n * intersectBezier3Ellipse\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n const result = new Intersection(\"No Intersection\");\n\n // Calculate the coefficients of cubic polynomial\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n const rxrx = rx*rx;\n const ryry = ry*ry;\n const poly = new Polynomial(\n c3.x*c3.x*ryry + c3.y*c3.y*rxrx,\n 2*(c3.x*c2.x*ryry + c3.y*c2.y*rxrx),\n 2*(c3.x*c1.x*ryry + c3.y*c1.y*rxrx) + c2.x*c2.x*ryry + c2.y*c2.y*rxrx,\n 2*c3.x*ryry*(c0.x - ec.x) + 2*c3.y*rxrx*(c0.y - ec.y) +\n 2*(c2.x*c1.x*ryry + c2.y*c1.y*rxrx),\n 2*c2.x*ryry*(c0.x - ec.x) + 2*c2.y*rxrx*(c0.y - ec.y) +\n c1.x*c1.x*ryry + c1.y*c1.y*rxrx,\n 2*c1.x*ryry*(c0.x - ec.x) + 2*c1.y*rxrx*(c0.y - ec.y),\n c0.x*c0.x*ryry - 2*c0.y*ec.y*rxrx - 2*c0.x*ec.x*ryry +\n c0.y*c0.y*rxrx + ec.x*ec.x*ryry + ec.y*ec.y*rxrx - rxrx*ryry\n );\n const roots = poly.getRootsInInterval(0, 1);\n\n for (const t of roots) {\n result.points.push(\n c3.multiply(t*t*t).add(c2.multiply(t*t).add(c1.multiply(t).add(c0)))\n );\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Line\n *\n * Many thanks to Dan Sunday at SoftSurfer.com. He gave me a very thorough\n * sketch of the algorithm used here. Without his help, I'm not sure when I\n * would have figured out this intersection problem.\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) {\n let a, b, c, d; // temporary variables\n // c3, c2, c1, c0; // coefficients of cubic\n // cl; // c coefficient for normal form of line\n // n; // normal for normal form of line\n const min = a1.min(a2); // used to determine if point is on line segment\n const max = a1.max(a2); // used to determine if point is on line segment\n const result = new Intersection(\"No Intersection\");\n\n // Start with Bezier using Bernstein polynomials for weighting functions:\n // (1-t^3)P1 + 3t(1-t)^2P2 + 3t^2(1-t)P3 + t^3P4\n //\n // Expand and collect terms to form linear combinations of original Bezier\n // controls. This ends up with a vector cubic in t:\n // (-P1+3P2-3P3+P4)t^3 + (3P1-6P2+3P3)t^2 + (-3P1+3P2)t + P1\n // /\\ /\\ /\\ /\\\n // || || || ||\n // c3 c2 c1 c0\n\n // Calculate the coefficients\n a = p1.multiply(-1);\n b = p2.multiply(3);\n c = p3.multiply(-3);\n d = a.add(b.add(c.add(p4)));\n const c3 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(3);\n b = p2.multiply(-6);\n c = p3.multiply(3);\n d = a.add(b.add(c));\n const c2 = new Vector2D(d.x, d.y);\n\n a = p1.multiply(-3);\n b = p2.multiply(3);\n c = a.add(b);\n const c1 = new Vector2D(c.x, c.y);\n\n const c0 = new Vector2D(p1.x, p1.y);\n\n // Convert line to normal form: ax + by + c = 0\n // Find normal to line: negative inverse of original line's slope\n const n = new Vector2D(a1.y - a2.y, a2.x - a1.x);\n\n // Determine new c coefficient\n const cl = a1.x*a2.y - a2.x*a1.y;\n\n // ?Rotate each cubic coefficient using line for new coordinate system?\n // Find roots of rotated cubic\n const roots = new Polynomial(\n n.dot(c3),\n n.dot(c2),\n n.dot(c1),\n n.dot(c0) + cl\n ).getRoots();\n\n // Any roots in closed interval [0,1] are intersections on Bezier, but\n // might not be on the line segment.\n // Find intersections and calculate point coordinates\n for (const t of roots) {\n if (0 <= t && t <= 1) {\n // We're within the Bezier curve\n // Find point on Bezier\n const p5 = p1.lerp(p2, t);\n const p6 = p2.lerp(p3, t);\n const p7 = p3.lerp(p4, t);\n\n const p8 = p5.lerp(p6, t);\n const p9 = p6.lerp(p7, t);\n\n const p10 = p8.lerp(p9, t);\n\n // See if point is on line segment\n // Had to make special cases for vertical and horizontal lines due\n // to slight errors in calculation of p10\n if (a1.x == a2.x) {\n if (min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (a1.y == a2.y) {\n if (min.x <= p10.x && p10.x <= max.x) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n else if (min.x <= p10.x && p10.x <= max.x && min.y <= p10.y && p10.y <= max.y) {\n result.status = \"Intersection\";\n result.appendPoint(p10);\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Polygon\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) {\n return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points));\n};\n\n\n/**\n * intersectBezier3Polyline\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n const inter = Intersection.intersectBezier3Line(p1, p2, p3, p4, a1, a2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectBezier3Rectangle\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectBezier3Line(p1, p2, p3, p4, min, topRight);\n const inter2 = Intersection.intersectBezier3Line(p1, p2, p3, p4, topRight, max);\n const inter3 = Intersection.intersectBezier3Line(p1, p2, p3, p4, max, bottomLeft);\n const inter4 = Intersection.intersectBezier3Line(p1, p2, p3, p4, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleCircle\n *\n * @param {module:kld-intersections.Point2D} c1\n * @param {number} r1\n * @param {module:kld-intersections.Point2D} c2\n * @param {number} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleCircle = function(c1, r1, c2, r2) {\n let result;\n\n // Determine minimum and maximum radii where circles can intersect\n const r_max = r1 + r2;\n const r_min = Math.abs(r1 - r2);\n\n // Determine actual distance between circle circles\n const c_dist = c1.distanceFrom(c2);\n\n if (c_dist > r_max) {\n result = new Intersection(\"Outside\");\n }\n else if (c_dist < r_min) {\n result = new Intersection(\"Inside\");\n }\n else {\n result = new Intersection(\"Intersection\");\n\n const a = (r1*r1 - r2*r2 + c_dist*c_dist) / (2*c_dist);\n const h = Math.sqrt(r1*r1 - a*a);\n const p = c1.lerp(c2, a/c_dist);\n const b = h / c_dist;\n\n result.points.push(\n new Point2D(\n p.x - b * (c2.y - c1.y),\n p.y + b * (c2.x - c1.x)\n )\n );\n result.points.push(\n new Point2D(\n p.x + b * (c2.y - c1.y),\n p.y - b * (c2.x - c1.x)\n )\n );\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleEllipse\n *\n * @param {module:kld-intersections.Point2D} cc\n * @param {number} r\n * @param {module:kld-intersections.Point2D} ec\n * @param {number} rx\n * @param {number} ry\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) {\n return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry);\n};\n\n\n/**\n * intersectCircleLine\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleLine = function(c, r, a1, a2) {\n let result;\n const a = (a2.x - a1.x) * (a2.x - a1.x) +\n (a2.y - a1.y) * (a2.y - a1.y);\n const b = 2 * ((a2.x - a1.x) * (a1.x - c.x) +\n (a2.y - a1.y) * (a1.y - c.y));\n const cc = c.x*c.x + c.y*c.y + a1.x*a1.x + a1.y*a1.y -\n 2 * (c.x * a1.x + c.y * a1.y) - r*r;\n const deter = b*b - 4*a*cc;\n\n if (deter < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (deter == 0) {\n result = new Intersection(\"Tangent\");\n // NOTE: should calculate this point\n }\n else {\n const e = Math.sqrt(deter);\n const u1 = (-b + e) / (2*a);\n const u2 = (-b - e) / (2*a);\n\n if ((u1 < 0 || u1 > 1) && (u2 < 0 || u2 > 1)) {\n if ((u1 < 0 && u2 < 0) || (u1 > 1 && u2 > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n\n if (0 <= u1 && u1 <= 1) {\n result.points.push(a1.lerp(a2, u1));\n }\n\n if (0 <= u2 && u2 <= 1) {\n result.points.push(a1.lerp(a2, u2));\n }\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectCirclePolygon\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCirclePolygon = function(c, r, points) {\n return this.intersectCirclePolyline(c, r, closePolygon(points));\n};\n\n\n/**\n * intersectCirclePolyline\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCirclePolyline = function(c, r, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n let inter;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points[i];\n const a2 = points[i + 1];\n\n inter = Intersection.intersectCircleLine(c, r, a1, a2);\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectCircleRectangle\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} r\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectCircleRectangle = function(c, r, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectCircleLine(c, r, min, topRight);\n const inter2 = Intersection.intersectCircleLine(c, r, topRight, max);\n const inter3 = Intersection.intersectCircleLine(c, r, max, bottomLeft);\n const inter4 = Intersection.intersectCircleLine(c, r, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n else {\n result.status = inter1.status;\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseEllipse\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {module:kld-intersections.Point2D} c1\n * @param {number} rx1\n * @param {number} ry1\n * @param {module:kld-intersections.Point2D} c2\n * @param {number} rx2\n * @param {number} ry2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) {\n const a = [\n ry1*ry1, 0, rx1*rx1, -2*ry1*ry1*c1.x, -2*rx1*rx1*c1.y,\n ry1*ry1*c1.x*c1.x + rx1*rx1*c1.y*c1.y - rx1*rx1*ry1*ry1\n ];\n const b = [\n ry2*ry2, 0, rx2*rx2, -2*ry2*ry2*c2.x, -2*rx2*rx2*c2.y,\n ry2*ry2*c2.x*c2.x + rx2*rx2*c2.y*c2.y - rx2*rx2*ry2*ry2\n ];\n\n const yPoly = Intersection.bezout(a, b);\n const yRoots = yPoly.getRoots();\n const epsilon = 1e-3;\n const norm0 = (a[0]*a[0] + 2*a[1]*a[1] + a[2]*a[2]) * epsilon;\n const norm1 = (b[0]*b[0] + 2*b[1]*b[1] + b[2]*b[2]) * epsilon;\n const result = new Intersection(\"No Intersection\");\n\n for (let y = 0; y < yRoots.length; y++) {\n const xPoly = new Polynomial(\n a[0],\n a[3] + yRoots[y] * a[1],\n a[5] + yRoots[y] * (a[4] + yRoots[y]*a[2])\n );\n const xRoots = xPoly.getRoots();\n\n for (let x = 0; x < xRoots.length; x++) {\n let tst =\n (a[0]*xRoots[x] + a[1]*yRoots[y] + a[3]) * xRoots[x] +\n (a[2]*yRoots[y] + a[4]) * yRoots[y] + a[5];\n if (Math.abs(tst) < norm0) {\n tst =\n (b[0]*xRoots[x] + b[1]*yRoots[y] + b[3]) * xRoots[x] +\n (b[2]*yRoots[y] + b[4]) * yRoots[y] + b[5];\n if (Math.abs(tst) < norm1) {\n result.appendPoint(new Point2D(xRoots[x], yRoots[y]));\n }\n }\n }\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseLine\n *\n * NOTE: Rotation will need to be added to this function\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipseLine = function(c, rx, ry, a1, a2) {\n let result;\n const orign = new Vector2D(a1.x, a1.y);\n const dir = Vector2D.fromPoints(a1, a2);\n const center = new Vector2D(c.x, c.y);\n const diff = orign.subtract(center);\n const mDir = new Vector2D(dir.x/(rx*rx), dir.y/(ry*ry));\n const mDiff = new Vector2D(diff.x/(rx*rx), diff.y/(ry*ry));\n\n const a = dir.dot(mDir);\n const b = dir.dot(mDiff);\n c = diff.dot(mDiff) - 1.0;\n const d = b*b - a*c;\n\n if (d < 0) {\n result = new Intersection(\"Outside\");\n }\n else if (d > 0) {\n const root = Math.sqrt(d); // eslint-disable-line no-shadow\n const t_a = (-b - root) / a;\n const t_b = (-b + root) / a;\n\n if ((t_a < 0 || 1 < t_a) && (t_b < 0 || 1 < t_b)) {\n if ((t_a < 0 && t_b < 0) || (t_a > 1 && t_b > 1)) {\n result = new Intersection(\"Outside\");\n }\n else {\n result = new Intersection(\"Inside\");\n }\n }\n else {\n result = new Intersection(\"Intersection\");\n if (0 <= t_a && t_a <= 1) {\n result.appendPoint(a1.lerp(a2, t_a));\n }\n if (0 <= t_b && t_b <= 1) {\n result.appendPoint(a1.lerp(a2, t_b));\n }\n }\n }\n else {\n const t = -b/a;\n\n if (0 <= t && t <= 1) {\n result = new Intersection(\"Intersection\");\n result.appendPoint(a1.lerp(a2, t));\n }\n else {\n result = new Intersection(\"Outside\");\n }\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipsePolygon\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipsePolygon = function(c, rx, ry, points) {\n return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points));\n};\n\n\n/**\n * intersectEllipsePolyline\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipsePolyline = function(c, rx, ry, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectEllipseLine(c, rx, ry, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectEllipseRectangle\n *\n * @param {module:kld-intersections.Point2D} c\n * @param {number} rx\n * @param {number} ry\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectEllipseLine(c, rx, ry, min, topRight);\n const inter2 = Intersection.intersectEllipseLine(c, rx, ry, topRight, max);\n const inter3 = Intersection.intersectEllipseLine(c, rx, ry, max, bottomLeft);\n const inter4 = Intersection.intersectEllipseLine(c, rx, ry, bottomLeft, min);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineLine\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLineLine = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n const ub = ub_t / u_b;\n\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else {\n result = new Intersection(\"No Intersection\");\n }\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * intersectLinePolygon\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLinePolygon = function(a1, a2, points) {\n return this.intersectLinePolyline(a1, a2, closePolygon(points));\n};\n\n\n/**\n * intersectLinePolyline\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {Array} points\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLinePolyline = function(a1, a2, points) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points;\n\n for (let i = 0; i < len - 1; i++) {\n const b1 = points[i];\n const b2 = points[i + 1];\n const inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectLineRectangle\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectLineRectangle = function(a1, a2, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineLine(min, topRight, a1, a2);\n const inter2 = Intersection.intersectLineLine(topRight, max, a1, a2);\n const inter3 = Intersection.intersectLineLine(max, bottomLeft, a1, a2);\n const inter4 = Intersection.intersectLineLine(bottomLeft, min, a1, a2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolygonPolygon\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolygonPolygon = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2));\n};\n\n\n/**\n * intersectPolygonPolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolygonPolyline = function(points1, points2) {\n return this.intersectPolylinePolyline(closePolygon(points1), points2);\n};\n\n\n/**\n * intersectPolygonRectangle\n *\n * @param {Array} points\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolygonRectangle = function(points, r1, r2) {\n return this.intersectPolylineRectangle(closePolygon(points), r1, r2);\n};\n\n\n/**\n * intersectPolylinePolyline\n *\n * @param {Array} points1\n * @param {Array} points2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolylinePolyline = function(points1, points2) {\n const result = new Intersection(\"No Intersection\");\n const {length: len} = points1;\n\n for (let i = 0; i < len - 1; i++) {\n const a1 = points1[i];\n const a2 = points1[i + 1];\n const inter = Intersection.intersectLinePolyline(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectPolylineRectangle\n *\n * @param {Array} points\n * @param {module:kld-intersections.Point2D} r1\n * @param {module:kld-intersections.Point2D} r2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectPolylineRectangle = function(points, r1, r2) {\n const min = r1.min(r2);\n const max = r1.max(r2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLinePolyline(min, topRight, points);\n const inter2 = Intersection.intersectLinePolyline(topRight, max, points);\n const inter3 = Intersection.intersectLinePolyline(max, bottomLeft, points);\n const inter4 = Intersection.intersectLinePolyline(bottomLeft, min, points);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRectangleRectangle\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectRectangleRectangle = function(a1, a2, b1, b2) {\n const min = a1.min(a2);\n const max = a1.max(a2);\n const topRight = new Point2D(max.x, min.y);\n const bottomLeft = new Point2D(min.x, max.y);\n\n const inter1 = Intersection.intersectLineRectangle(min, topRight, b1, b2);\n const inter2 = Intersection.intersectLineRectangle(topRight, max, b1, b2);\n const inter3 = Intersection.intersectLineRectangle(max, bottomLeft, b1, b2);\n const inter4 = Intersection.intersectLineRectangle(bottomLeft, min, b1, b2);\n\n const result = new Intersection(\"No Intersection\");\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = \"Intersection\";\n }\n\n return result;\n};\n\n\n/**\n * intersectRayRay\n *\n * @param {module:kld-intersections.Point2D} a1\n * @param {module:kld-intersections.Point2D} a2\n * @param {module:kld-intersections.Point2D} b1\n * @param {module:kld-intersections.Point2D} b2\n * @returns {module:kld-intersections.Intersection}\n */\nIntersection.intersectRayRay = function(a1, a2, b1, b2) {\n let result;\n\n const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);\n const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n if (u_b != 0) {\n const ua = ua_t / u_b;\n\n result = new Intersection(\"Intersection\");\n result.points.push(\n new Point2D(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n )\n );\n }\n else if (ua_t == 0 || ub_t == 0) {\n result = new Intersection(\"Coincident\");\n }\n else {\n result = new Intersection(\"Parallel\");\n }\n\n return result;\n};\n\n\n/**\n * bezout\n *\n * This code is based on MgcIntr2DElpElp.cpp written by David Eberly. His\n * code along with many other excellent examples are avaiable at his site:\n * http://www.magic-software.com\n *\n * @param {Array} e1\n * @param {Array} e2\n * @returns {external:Polynomial}\n */\nIntersection.bezout = function(e1, e2) {\n const AB = e1[0]*e2[1] - e2[0]*e1[1];\n const AC = e1[0]*e2[2] - e2[0]*e1[2];\n const AD = e1[0]*e2[3] - e2[0]*e1[3];\n const AE = e1[0]*e2[4] - e2[0]*e1[4];\n const AF = e1[0]*e2[5] - e2[0]*e1[5];\n const BC = e1[1]*e2[2] - e2[1]*e1[2];\n const BE = e1[1]*e2[4] - e2[1]*e1[4];\n const BF = e1[1]*e2[5] - e2[1]*e1[5];\n const CD = e1[2]*e2[3] - e2[2]*e1[3];\n const DE = e1[3]*e2[4] - e2[3]*e1[4];\n const DF = e1[3]*e2[5] - e2[3]*e1[5];\n const BFpDE = BF + DE;\n const BEmCD = BE - CD;\n\n return new Polynomial(\n AB*BC - AC*AC,\n AB*BEmCD + AD*BC - 2*AC*AE,\n AB*BFpDE + AD*BEmCD - AE*AE - 2*AC*AF,\n AB*DF + AD*BFpDE - 2*AE*AF,\n AD*DF - AF*AF\n );\n};\n\nexport default Intersection;\n","/**\n *\n * IntersectionArgs.js\n *\n * @copyright 2002, 2017 Kevin Lindsey\n *\n */\n\n/**\n * IntersectionArgs\n * @memberof module:kld-intersections\n */\nclass IntersectionArgs {\n /**\n * @param {string} name\n * @param {Array} args\n * @returns {module:kld-intersections.IntersectionArgs}\n */\n constructor(name, args) {\n this.init(name, args);\n }\n /**\n * init\n *\n * @param {string} name\n * @param {Array} args\n */\n init(name, args) {\n this.name = name;\n this.args = args;\n }\n}\n\nexport default IntersectionArgs;\n","/**\n * Shapes\n *\n * @copyright 2017, Kevin Lindsey\n * @module Shapes\n */\n\nimport {Point2D} from \"kld-affine\";\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\n/**\n * @namespace\n */\nconst Shapes = {};\n\n/**\n * quadraticBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) {\n return new IntersectionArgs(\"Bezier2\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y)\n ]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @param {number} p3x\n * @param {number} p3y\n * @param {number} p4x\n * @param {number} p4y\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return new IntersectionArgs(\"Bezier3\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y),\n new Point2D(p3x, p3y),\n new Point2D(p4x, p4y)\n ]);\n};\n\n\n/**\n * circle\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radius\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.circle = function(centerX, centerY, radius) {\n return new IntersectionArgs(\"Circle\", [\n new Point2D(centerX, centerY),\n radius\n ]);\n};\n\n\n/**\n * ellipse\n *\n * @param {number} centerX\n * @param {number} centerY\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.ellipse = function(centerX, centerY, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [\n new Point2D(centerX, centerY),\n radiusX,\n radiusY\n ]);\n};\n\n\n/**\n * line\n *\n * @param {number} p1x\n * @param {number} p1y\n * @param {number} p2x\n * @param {number} p2y\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.line = function(p1x, p1y, p2x, p2y) {\n return new IntersectionArgs(\"Line\", [\n new Point2D(p1x, p1y),\n new Point2D(p2x, p2y)\n ]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", segments);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} coords\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.polygon = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} coords\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.polyline = function(coords) {\n const points = [];\n\n for (let i = 0; i < coords.length; i += 2) {\n points.push(new Point2D(coords[i], coords[i + 1]));\n }\n\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nShapes.rectangle = function(x, y, width, height) {\n return new IntersectionArgs(\"Rectangle\", [\n new Point2D(x, y),\n new Point2D(x + width, y + height)\n ]);\n};\n\n\nexport default Shapes;\n","/**\n * AffineShapes\n *\n * @copyright 2017, Kevin Lindsey\n * @module AffineShapes\n */\n\nimport IntersectionArgs from \"./IntersectionArgs.js\";\n\n/**\n * @namespace\n */\nconst AffineShapes = {};\n\n/**\n * quadraticBezier\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.quadraticBezier = function(p1, p2, p3) {\n return new IntersectionArgs(\"Bezier2\", [p1, p2, p3]);\n};\n\n\n/**\n * cubicBezier\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @param {module:kld-intersections.Point2D} p3\n * @param {module:kld-intersections.Point2D} p4\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.cubicBezier = function(p1, p2, p3, p4) {\n return new IntersectionArgs(\"Bezier3\", [p1, p2, p3, p4]);\n};\n\n\n/**\n * circle\n *\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radius\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.circle = function(center, radius) {\n return new IntersectionArgs(\"Circle\", [center, radius]);\n};\n\n\n/**\n * ellipse\n *\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.ellipse = function(center, radiusX, radiusY) {\n return new IntersectionArgs(\"Ellipse\", [center, radiusX, radiusY]);\n};\n\n\n/**\n * line\n *\n * @param {module:kld-intersections.Point2D} p1\n * @param {module:kld-intersections.Point2D} p2\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.line = function(p1, p2) {\n return new IntersectionArgs(\"Line\", [p1, p2]);\n};\n\n\n/**\n * path\n *\n * @param {Array} segments\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.path = function(segments) {\n return new IntersectionArgs(\"Path\", [segments]);\n};\n\n\n/**\n * polygon\n *\n * @param {Array} points\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.polygon = function(points) {\n return new IntersectionArgs(\"Polygon\", [points]);\n};\n\n\n/**\n * polyline\n *\n * @param {Array} points\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.polyline = function(points) {\n return new IntersectionArgs(\"Polyline\", [points]);\n};\n\n\n/**\n * rectangle\n *\n * @param {module:kld-intersections.Point2D} topLeft\n * @param {module:kld-intersections.Vector2D} size\n * @returns {module:kld-intersections.IntersectionArgs}\n */\nAffineShapes.rectangle = function(topLeft, size) {\n return new IntersectionArgs(\"Rectangle\", [topLeft, topLeft.add(size)]);\n};\n\n\nexport default AffineShapes;\n","/**\n *\n * IntersectionQuery.js\n *\n * @copyright 2017 Kevin Lindsey\n * @module IntersectionQuery\n */\n\nimport {Vector2D} from \"kld-affine\";\n\n/**\n * @namespace\n */\nconst IntersectionQuery = {};\n\n\n/**\n * pointInCircle\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radius\n * @returns {boolean}\n */\nIntersectionQuery.pointInCircle = function(point, center, radius) {\n const v = Vector2D.fromPoints(center, point);\n\n return v.length() <= radius;\n};\n\n\n/**\n * pointInEllipse\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {module:kld-intersections.Point2D} center\n * @param {number} radiusX\n * @param {number} radiusY\n * @returns {boolean}\n */\nIntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) {\n const len = point.subtract(center);\n\n return (len.x * len.x) / (radiusX * radiusX) + (len.y * len.y) / (radiusY * radiusY) <= 1;\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolyline = function(point, points) {\n const {length: len} = points;\n let counter = 0;\n let xInter;\n\n let p1 = points[0];\n\n for (let i = 1; i <= len; i++) {\n const p2 = points[i % len];\n const minY = Math.min(p1.y, p2.y);\n const maxY = Math.max(p1.y, p2.y);\n const maxX = Math.max(p1.x, p2.x);\n\n if (p1.y !== p2.y && minY < point.y && point.y <= maxY && point.x <= maxX) {\n xInter = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;\n\n if (p1.x === p2.x || point.x <= xInter) {\n counter++;\n }\n }\n\n p1 = p2;\n }\n\n return (counter % 2 === 1);\n};\n\n\n/**\n * pointInPolyline\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {Array} points\n */\nIntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline;\n\n\n/**\n * pointInRectangle\n *\n * @param {module:kld-intersections.Point2D} point\n * @param {module:kld-intersections.Point2D} topLeft\n * @param {module:kld-intersections.Point2D} bottomRight\n * @returns {boolean}\n */\nIntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) {\n return (\n topLeft.x <= point.x && point.x < bottomRight.x &&\n topLeft.y <= point.y && point.y < bottomRight.y\n );\n};\n\n\nexport default IntersectionQuery;\n"],"names":["Point2D","x","y","Object","defineProperties","this","value","undefined","writable","enumerable","configurable","prototype","clone","constructor","add","that","subtract","multiply","scalar","divide","equals","precisionEquals","precision","Math","abs","lerp","t","omt","distanceFrom","dx","dy","sqrt","min","max","transform","matrix","a","c","e","b","d","f","toString","module","Vector2D","fromPoints","p1","p2","length","magnitude","dot","cross","determinant","unit","angleBetween","cos","radians","acos","perp","perpendicular","project","percent","setReadonlyProperty","object","property","defineProperty","Matrix2D","IDENTITY","translation","tx","ty","scaling","scale","scalingAt","center","nonUniformScaling","scaleX","scaleY","nonUniformScalingAt","rotation","s","sin","rotationAt","rotationFromVector","vector","xFlip","yFlip","xSkew","tan","ySkew","isIdentity","inverse","det1","idet","det2","det3","translate","scaleAt","scaleNonUniform","scaleNonUniformAt","rotate","rotateAt","cx","cy","rotateFromVector","flipX","flipY","skewX","skewY","isInvertible","getScale","getDecomposition","E","F","G","H","Q","R","a1","atan2","a2","theta","phi","rotation0","join","require","Polynomial","init","arguments","TOLERANCE","ACCURACY","interpolate","xs","ys","n","offset","Array","Error","isNaN","ns","diff","i","dift","m","ho","hp","w","den","coefs","push","_variable","_s","eval","result","d1","getDegree","d2","dmax","v1","v2","j","divide_scalar","simplify","pop","bisection","minValue","maxValue","tmp1","log","tmp2","LN10","iters","ceil","LN2","signs","round","sign","trapezoid","range","it","delta","sum","simpson","st","os","ost","romberg","MAX","h","getDerivative","derivative","getRoots","getLinearRoot","getQuadraticRoots","getCubicRoots","getQuarticRoots","getRootsInInterval","root","roots","droots","results","c3","c2","c1","discrim","halfB","ZEROepsilon","zeroErrorEstimate","tmp","pow","distance","angle","sqrt3","NaN","poly","slice","poly_d","derrt","sort","dery","nr","rb","bounds","maxabsX","minX","maxX","guesses","minmax","df","newton_secant_bisection","concat","an","reduce","v","nm","bounds_UpperReal_Fujiwara","map","coefSelectionFunc","find2Max","acc","bi","nearmax","max_nearmax_pos","negX","posX","bounds_LowerReal_Fujiwara","reverse","res","urb","x0","max_iterations","dfx","x_correction","x_new","y_atmin","y_atmax","prev_dfx","prev_x_ef_correction","min_correction_factor","isBounded","isEnoughCorrection","SqrtPolynomial","VERSION","superclass","call","isNullish","o","closePolygon","points","copy","Intersection","status","point","intersect","shape1","shape2","name","intersectPathShape","method","args","apply","path","shape","segment","inter","appendPoints","intersectBezier2Bezier2","a3","b1","b2","b3","c12","c11","c10","c22","c21","c20","g","xp","xRoots","yp","yRoots","checkRoots","xRoot","k","intersectBezier2Bezier3","b4","c23","c10x2","c10y2","c11x2","c11y2","c12x2","c12y2","c20x2","c20y2","c21x2","c21y2","c22x2","c22y2","c23x2","c23y2","intersectBezier2Circle","p3","r","intersectBezier2Ellipse","ec","rx","ry","c0","rxrx","ryry","intersectBezier2Line","cl","p4","p5","p6","appendPoint","intersectBezier2Polygon","intersectBezier2Polyline","len","intersectBezier2Rectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","intersectBezier3Bezier3","a4","c13","e0","e1","e2","e3","f0","f1","f2","f3","g0","g1","g2","g3","h0","h1","h2","h3","i0","i1","i2","i3","intersectBezier3Circle","intersectBezier3Ellipse","intersectBezier3Line","p7","p8","p9","p10","intersectBezier3Polygon","intersectBezier3Polyline","intersectBezier3Rectangle","intersectCircleCircle","r_max","r_min","c_dist","p","intersectCircleEllipse","cc","intersectEllipseEllipse","intersectCircleLine","deter","u1","u2","intersectCirclePolygon","intersectCirclePolyline","intersectCircleRectangle","rx1","ry1","rx2","ry2","bezout","norm0","norm1","tst","intersectEllipseLine","orign","dir","mDir","mDiff","t_a","t_b","intersectEllipsePolygon","intersectEllipsePolyline","intersectEllipseRectangle","intersectLineLine","ua_t","ub_t","u_b","ua","ub","intersectLinePolygon","intersectLinePolyline","intersectLineRectangle","intersectPolygonPolygon","points1","points2","intersectPolylinePolyline","intersectPolygonPolyline","intersectPolygonRectangle","intersectPolylineRectangle","intersectRectangleRectangle","intersectRayRay","AB","AC","AD","AE","AF","BC","BE","BF","CD","DE","DF","BFpDE","BEmCD","IntersectionArgs","Shapes","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","centerX","centerY","radius","radiusX","radiusY","segments","coords","width","height","AffineShapes","topLeft","size","IntersectionQuery","xInter","counter","minY","maxY","pointInPolygon","pointInPolyline","pointInRectangle","bottomRight"],"mappings":"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"} \ No newline at end of file diff --git a/index.js b/index.js index 8e7bf4e..4ce7aba 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,66 @@ +/** + * @module kld-intersections + */ // expose module classes + export {default as Intersection} from "./lib/Intersection.js"; + export {default as IntersectionArgs} from "./lib/IntersectionArgs.js"; + +/** + * @namespace Shapes + * @implements {module:Shapes~Shapes} + */ export {default as Shapes} from "./lib/Shapes.js"; + +/** + * @namespace AffineShapes + * @implements {module:AffineShapes~AffineShapes} + */ export {default as AffineShapes} from "./lib/AffineShapes.js"; + +/** + * @namespace IntersectionQuery + * @implements {module:IntersectionQuery~IntersectionQuery} + */ export {default as IntersectionQuery} from "./lib/IntersectionQuery.js"; -// expose affine module classes -export {Point2D, Vector2D, Matrix2D} from "kld-affine"; +// Expose affine module classes + +/** +* @external Point2D +*/ + +/** +* @external Vector2D +*/ + +/** +* @external Matrix2D +*/ + +/** + * @class Point2D + * @memberof module:kld-intersections + * @implements {external:Point2D} + */ +export {Point2D} from "kld-affine"; + +/** + * @class Vector2D + * @memberof module:kld-intersections + * @implements {external:Vector2D} + */ +export {Vector2D} from "kld-affine"; + +/** + * @class Matrix2D + * @memberof module:kld-intersections + * @implements {external:Matrix2D} + */ +export {Matrix2D} from "kld-affine"; + + +/** +* @external Polynomial +*/ diff --git a/lib/AffineShapes.js b/lib/AffineShapes.js index b6cb8e9..67ef25f 100644 --- a/lib/AffineShapes.js +++ b/lib/AffineShapes.js @@ -2,19 +2,22 @@ * AffineShapes * * @copyright 2017, Kevin Lindsey + * @module AffineShapes */ import IntersectionArgs from "./IntersectionArgs.js"; +/** + * @namespace + */ const AffineShapes = {}; /** * quadraticBezier - * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.quadraticBezier = function(p1, p2, p3) { return new IntersectionArgs("Bezier2", [p1, p2, p3]); @@ -24,11 +27,11 @@ AffineShapes.quadraticBezier = function(p1, p2, p3) { /** * cubicBezier * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.cubicBezier = function(p1, p2, p3, p4) { return new IntersectionArgs("Bezier3", [p1, p2, p3, p4]); @@ -38,9 +41,9 @@ AffineShapes.cubicBezier = function(p1, p2, p3, p4) { /** * circle * - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} center * @param {number} radius - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.circle = function(center, radius) { return new IntersectionArgs("Circle", [center, radius]); @@ -50,10 +53,10 @@ AffineShapes.circle = function(center, radius) { /** * ellipse * - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} center * @param {number} radiusX * @param {number} radiusY - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.ellipse = function(center, radiusX, radiusY) { return new IntersectionArgs("Ellipse", [center, radiusX, radiusY]); @@ -63,9 +66,9 @@ AffineShapes.ellipse = function(center, radiusX, radiusY) { /** * line * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.line = function(p1, p2) { return new IntersectionArgs("Line", [p1, p2]); @@ -75,8 +78,8 @@ AffineShapes.line = function(p1, p2) { /** * path * - * @param {Array} segments - * @returns {IntersectionArgs} + * @param {Array} segments + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.path = function(segments) { return new IntersectionArgs("Path", [segments]); @@ -86,8 +89,8 @@ AffineShapes.path = function(segments) { /** * polygon * - * @param {Array} points - * @returns {IntersectionArgs} + * @param {Array} points + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.polygon = function(points) { return new IntersectionArgs("Polygon", [points]); @@ -97,8 +100,8 @@ AffineShapes.polygon = function(points) { /** * polyline * - * @param {Array} points - * @returns {IntersectionArgs} + * @param {Array} points + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.polyline = function(points) { return new IntersectionArgs("Polyline", [points]); @@ -108,9 +111,9 @@ AffineShapes.polyline = function(points) { /** * rectangle * - * @param {Point2D} topLeft - * @param {Vector2D} size - * @returns {IntersectionArgs} + * @param {module:kld-intersections.Point2D} topLeft + * @param {module:kld-intersections.Vector2D} size + * @returns {module:kld-intersections.IntersectionArgs} */ AffineShapes.rectangle = function(topLeft, size) { return new IntersectionArgs("Rectangle", [topLeft, topLeft.add(size)]); diff --git a/lib/Intersection.js b/lib/Intersection.js index a11db67..cd86f2c 100644 --- a/lib/Intersection.js +++ b/lib/Intersection.js @@ -4,14 +4,13 @@ * Intersection.js * * copyright 2002, 2013 Kevin Lindsey - * */ import {Point2D, Vector2D} from "kld-affine"; import {Polynomial} from "kld-polynomial"; /** - * + * @memberof module:kld-intersections.Intersection~ * @param {*} o * @returns {boolean} */ @@ -21,9 +20,9 @@ function isNullish(o) { /** * closePolygon - * - * @param {Array} points - * @returns {Array} + * @memberof module:kld-intersections.Intersection~ + * @param {Array} points + * @returns {Array} */ function closePolygon(points) { const copy = points.slice(); @@ -35,11 +34,13 @@ function closePolygon(points) { /** - * Intersection + * Intersection + * @memberof module:kld-intersections */ class Intersection { /** * @param {string} status + * @returns {module:kld-intersections.Intersection} */ constructor(status) { this.init(status); @@ -50,7 +51,7 @@ class Intersection { * init * * @param {string} status - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ init(status) { this.status = status; @@ -61,7 +62,7 @@ class Intersection { /** * appendPoint * - * @param {Point2D} point + * @param {module:kld-intersections.Point2D} point */ appendPoint(point) { this.points.push(point); @@ -71,7 +72,7 @@ class Intersection { /** * appendPoints * - * @param {Array} points + * @param {Array} points */ appendPoints(points) { this.points = this.points.concat(points); @@ -83,9 +84,9 @@ class Intersection { /** * intersect * - * @param {IntersectionArgs} shape1 - * @param {IntersectionArgs} shape2 - * @returns {Intersection} + * @param {module:kld-intersections.IntersectionArgs} shape1 + * @param {module:kld-intersections.IntersectionArgs} shape2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersect = function(shape1, shape2) { let result; @@ -128,9 +129,9 @@ Intersection.intersect = function(shape1, shape2) { /** * intersectPathShape * - * @param {IntersectionArgs} path - * @param {IntersectionArgs} shape - * @returns {Intersection} + * @param {module:kld-intersections.IntersectionArgs} path + * @param {module:kld-intersections.IntersectionArgs} shape + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectPathShape = function(path, shape) { const result = new Intersection("No Intersection"); @@ -152,13 +153,13 @@ Intersection.intersectPathShape = function(path, shape) { /** * intersectBezier2Bezier2 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) { let a, b; @@ -248,14 +249,14 @@ Intersection.intersectBezier2Bezier2 = function(a1, a2, a3, b1, b2, b3) { /** * intersectBezier2Bezier3 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @param {module:kld-intersections.Point2D} b4 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) { let a, b, c, d; @@ -375,12 +376,12 @@ Intersection.intersectBezier2Bezier3 = function(a1, a2, a3, b1, b2, b3, b4) { /** * intersectBezier2Circle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Circle = function(p1, p2, p3, c, r) { return Intersection.intersectBezier2Ellipse(p1, p2, p3, c, r, r); @@ -390,13 +391,13 @@ Intersection.intersectBezier2Circle = function(p1, p2, p3, c, r) { /** * intersectBezier2Ellipse * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) { let a; // temporary variables @@ -441,12 +442,12 @@ Intersection.intersectBezier2Ellipse = function(p1, p2, p3, ec, rx, ry) { /** * intersectBezier2Line * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) { let a; // temporary variables @@ -522,11 +523,11 @@ Intersection.intersectBezier2Line = function(p1, p2, p3, a1, a2) { /** * intersectBezier2Polygon * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Polygon = function(p1, p2, p3, points) { return Intersection.intersectBezier2Polyline(p1, p2, p3, closePolygon(points)); @@ -536,11 +537,11 @@ Intersection.intersectBezier2Polygon = function(p1, p2, p3, points) { /** * intersectBezier2Polyline * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Polyline = function(p1, p2, p3, points) { const result = new Intersection("No Intersection"); @@ -565,12 +566,12 @@ Intersection.intersectBezier2Polyline = function(p1, p2, p3, points) { /** * intersectBezier2Rectangle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) { const min = r1.min(r2); @@ -601,15 +602,15 @@ Intersection.intersectBezier2Rectangle = function(p1, p2, p3, r1, r2) { /** * intersectBezier3Bezier3 * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} a3 - * @param {Point2D} a4 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @param {Point2D} b3 - * @param {Point2D} b4 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} a3 + * @param {module:kld-intersections.Point2D} a4 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @param {module:kld-intersections.Point2D} b3 + * @param {module:kld-intersections.Point2D} b4 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) { let a, b, c, d; // temporary variables @@ -749,13 +750,13 @@ Intersection.intersectBezier3Bezier3 = function(a1, a2, a3, a4, b1, b2, b3, b4) /** * intersectBezier3Circle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) { return Intersection.intersectBezier3Ellipse(p1, p2, p3, p4, c, r, r); @@ -765,14 +766,14 @@ Intersection.intersectBezier3Circle = function(p1, p2, p3, p4, c, r) { /** * intersectBezier3Ellipse * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) { let a, b, c, d; // temporary variables @@ -836,13 +837,13 @@ Intersection.intersectBezier3Ellipse = function(p1, p2, p3, p4, ec, rx, ry) { * sketch of the algorithm used here. Without his help, I'm not sure when I * would have figured out this intersection problem. * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) { let a, b, c, d; // temporary variables @@ -944,12 +945,12 @@ Intersection.intersectBezier3Line = function(p1, p2, p3, p4, a1, a2) { /** * intersectBezier3Polygon * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) { return this.intersectBezier3Polyline(p1, p2, p3, p4, closePolygon(points)); @@ -959,12 +960,12 @@ Intersection.intersectBezier3Polygon = function(p1, p2, p3, p4, points) { /** * intersectBezier3Polyline * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) { const result = new Intersection("No Intersection"); @@ -989,13 +990,13 @@ Intersection.intersectBezier3Polyline = function(p1, p2, p3, p4, points) { /** * intersectBezier3Rectangle * - * @param {Point2D} p1 - * @param {Point2D} p2 - * @param {Point2D} p3 - * @param {Point2D} p4 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} p1 + * @param {module:kld-intersections.Point2D} p2 + * @param {module:kld-intersections.Point2D} p3 + * @param {module:kld-intersections.Point2D} p4 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) { const min = r1.min(r2); @@ -1026,11 +1027,11 @@ Intersection.intersectBezier3Rectangle = function(p1, p2, p3, p4, r1, r2) { /** * intersectCircleCircle * - * @param {Point2D} c1 + * @param {module:kld-intersections.Point2D} c1 * @param {number} r1 - * @param {Point2D} c2 + * @param {module:kld-intersections.Point2D} c2 * @param {number} r2 - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectCircleCircle = function(c1, r1, c2, r2) { let result; @@ -1077,12 +1078,12 @@ Intersection.intersectCircleCircle = function(c1, r1, c2, r2) { /** * intersectCircleEllipse * - * @param {Point2D} cc + * @param {module:kld-intersections.Point2D} cc * @param {number} r - * @param {Point2D} ec + * @param {module:kld-intersections.Point2D} ec * @param {number} rx * @param {number} ry - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) { return Intersection.intersectEllipseEllipse(cc, r, r, ec, rx, ry); @@ -1092,11 +1093,11 @@ Intersection.intersectCircleEllipse = function(cc, r, ec, rx, ry) { /** * intersectCircleLine * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectCircleLine = function(c, r, a1, a2) { let result; @@ -1148,10 +1149,10 @@ Intersection.intersectCircleLine = function(c, r, a1, a2) { /** * intersectCirclePolygon * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectCirclePolygon = function(c, r, points) { return this.intersectCirclePolyline(c, r, closePolygon(points)); @@ -1161,10 +1162,10 @@ Intersection.intersectCirclePolygon = function(c, r, points) { /** * intersectCirclePolyline * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectCirclePolyline = function(c, r, points) { const result = new Intersection("No Intersection"); @@ -1193,11 +1194,11 @@ Intersection.intersectCirclePolyline = function(c, r, points) { /** * intersectCircleRectangle * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} r - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectCircleRectangle = function(c, r, r1, r2) { const min = r1.min(r2); @@ -1237,13 +1238,13 @@ Intersection.intersectCircleRectangle = function(c, r, r1, r2) { * * NOTE: Rotation will need to be added to this function * - * @param {Point2D} c1 + * @param {module:kld-intersections.Point2D} c1 * @param {number} rx1 * @param {number} ry1 - * @param {Point2D} c2 + * @param {module:kld-intersections.Point2D} c2 * @param {number} rx2 * @param {number} ry2 - * @returns {Intersection} + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) { const a = [ @@ -1298,12 +1299,12 @@ Intersection.intersectEllipseEllipse = function(c1, rx1, ry1, c2, rx2, ry2) { * * NOTE: Rotation will need to be added to this function * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Point2D} a1 - * @param {Point2D} a2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectEllipseLine = function(c, rx, ry, a1, a2) { let result; @@ -1364,11 +1365,11 @@ Intersection.intersectEllipseLine = function(c, rx, ry, a1, a2) { /** * intersectEllipsePolygon * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectEllipsePolygon = function(c, rx, ry, points) { return this.intersectEllipsePolyline(c, rx, ry, closePolygon(points)); @@ -1378,11 +1379,11 @@ Intersection.intersectEllipsePolygon = function(c, rx, ry, points) { /** * intersectEllipsePolyline * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Array} points - * @returns {Intersection} + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectEllipsePolyline = function(c, rx, ry, points) { const result = new Intersection("No Intersection"); @@ -1407,12 +1408,12 @@ Intersection.intersectEllipsePolyline = function(c, rx, ry, points) { /** * intersectEllipseRectangle * - * @param {Point2D} c + * @param {module:kld-intersections.Point2D} c * @param {number} rx * @param {number} ry - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) { const min = r1.min(r2); @@ -1443,11 +1444,11 @@ Intersection.intersectEllipseRectangle = function(c, rx, ry, r1, r2) { /** * intersectLineLine * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectLineLine = function(a1, a2, b1, b2) { let result; @@ -1487,10 +1488,10 @@ Intersection.intersectLineLine = function(a1, a2, b1, b2) { /** * intersectLinePolygon * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectLinePolygon = function(a1, a2, points) { return this.intersectLinePolyline(a1, a2, closePolygon(points)); @@ -1500,10 +1501,10 @@ Intersection.intersectLinePolygon = function(a1, a2, points) { /** * intersectLinePolyline * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Array} points - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {Array} points + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectLinePolyline = function(a1, a2, points) { const result = new Intersection("No Intersection"); @@ -1528,11 +1529,11 @@ Intersection.intersectLinePolyline = function(a1, a2, points) { /** * intersectLineRectangle * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectLineRectangle = function(a1, a2, r1, r2) { const min = r1.min(r2); @@ -1563,9 +1564,9 @@ Intersection.intersectLineRectangle = function(a1, a2, r1, r2) { /** * intersectPolygonPolygon * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectPolygonPolygon = function(points1, points2) { return this.intersectPolylinePolyline(closePolygon(points1), closePolygon(points2)); @@ -1575,9 +1576,9 @@ Intersection.intersectPolygonPolygon = function(points1, points2) { /** * intersectPolygonPolyline * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectPolygonPolyline = function(points1, points2) { return this.intersectPolylinePolyline(closePolygon(points1), points2); @@ -1587,10 +1588,10 @@ Intersection.intersectPolygonPolyline = function(points1, points2) { /** * intersectPolygonRectangle * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {Array} points + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectPolygonRectangle = function(points, r1, r2) { return this.intersectPolylineRectangle(closePolygon(points), r1, r2); @@ -1600,9 +1601,9 @@ Intersection.intersectPolygonRectangle = function(points, r1, r2) { /** * intersectPolylinePolyline * - * @param {Array} points1 - * @param {Array} points2 - * @returns {Intersection} + * @param {Array} points1 + * @param {Array} points2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectPolylinePolyline = function(points1, points2) { const result = new Intersection("No Intersection"); @@ -1627,10 +1628,10 @@ Intersection.intersectPolylinePolyline = function(points1, points2) { /** * intersectPolylineRectangle * - * @param {Array} points - * @param {Point2D} r1 - * @param {Point2D} r2 - * @returns {Intersection} + * @param {Array} points + * @param {module:kld-intersections.Point2D} r1 + * @param {module:kld-intersections.Point2D} r2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectPolylineRectangle = function(points, r1, r2) { const min = r1.min(r2); @@ -1661,11 +1662,11 @@ Intersection.intersectPolylineRectangle = function(points, r1, r2) { /** * intersectRectangleRectangle * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectRectangleRectangle = function(a1, a2, b1, b2) { const min = a1.min(a2); @@ -1696,11 +1697,11 @@ Intersection.intersectRectangleRectangle = function(a1, a2, b1, b2) { /** * intersectRayRay * - * @param {Point2D} a1 - * @param {Point2D} a2 - * @param {Point2D} b1 - * @param {Point2D} b2 - * @returns {Intersection} + * @param {module:kld-intersections.Point2D} a1 + * @param {module:kld-intersections.Point2D} a2 + * @param {module:kld-intersections.Point2D} b1 + * @param {module:kld-intersections.Point2D} b2 + * @returns {module:kld-intersections.Intersection} */ Intersection.intersectRayRay = function(a1, a2, b1, b2) { let result; @@ -1738,9 +1739,9 @@ Intersection.intersectRayRay = function(a1, a2, b1, b2) { * code along with many other excellent examples are avaiable at his site: * http://www.magic-software.com * - * @param {Array} e1 - * @param {Array} e2 - * @returns {Polynomial} + * @param {Array} e1 + * @param {Array} e2 + * @returns {external:Polynomial} */ Intersection.bezout = function(e1, e2) { const AB = e1[0]*e2[1] - e2[0]*e1[1]; diff --git a/lib/IntersectionArgs.js b/lib/IntersectionArgs.js index 13368db..ffeee69 100644 --- a/lib/IntersectionArgs.js +++ b/lib/IntersectionArgs.js @@ -8,13 +8,13 @@ /** * IntersectionArgs - * + * @memberof module:kld-intersections */ class IntersectionArgs { /** * @param {string} name - * @param {Array} args - * @returns {IntersectionArgs} + * @param {Array} args + * @returns {module:kld-intersections.IntersectionArgs} */ constructor(name, args) { this.init(name, args); @@ -23,7 +23,7 @@ class IntersectionArgs { * init * * @param {string} name - * @param {Array} args + * @param {Array} args */ init(name, args) { this.name = name; diff --git a/lib/IntersectionQuery.js b/lib/IntersectionQuery.js index fef841c..ea2c814 100644 --- a/lib/IntersectionQuery.js +++ b/lib/IntersectionQuery.js @@ -3,13 +3,13 @@ * IntersectionQuery.js * * @copyright 2017 Kevin Lindsey - * + * @module IntersectionQuery */ import {Vector2D} from "kld-affine"; /** - * + * @namespace */ const IntersectionQuery = {}; @@ -17,8 +17,8 @@ const IntersectionQuery = {}; /** * pointInCircle * - * @param {Point2D} point - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} center * @param {number} radius * @returns {boolean} */ @@ -32,8 +32,8 @@ IntersectionQuery.pointInCircle = function(point, center, radius) { /** * pointInEllipse * - * @param {Point2D} point - * @param {Point2D} center + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} center * @param {number} radiusX * @param {number} radiusY * @returns {boolean} @@ -48,8 +48,8 @@ IntersectionQuery.pointInEllipse = function(point, center, radiusX, radiusY) { /** * pointInPolyline * - * @param {Point2D} point - * @param {Array} points + * @param {module:kld-intersections.Point2D} point + * @param {Array} points */ IntersectionQuery.pointInPolyline = function(point, points) { const {length: len} = points; @@ -82,8 +82,8 @@ IntersectionQuery.pointInPolyline = function(point, points) { /** * pointInPolyline * - * @param {Point2D} point - * @param {Array} points + * @param {module:kld-intersections.Point2D} point + * @param {Array} points */ IntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline; @@ -91,9 +91,9 @@ IntersectionQuery.pointInPolygon = IntersectionQuery.pointInPolyline; /** * pointInRectangle * - * @param {Point2D} point - * @param {Point2D} topLeft - * @param {Point2D} bottomRight + * @param {module:kld-intersections.Point2D} point + * @param {module:kld-intersections.Point2D} topLeft + * @param {module:kld-intersections.Point2D} bottomRight * @returns {boolean} */ IntersectionQuery.pointInRectangle = function(point, topLeft, bottomRight) { diff --git a/lib/Shapes.js b/lib/Shapes.js index d81f92d..66f9ae9 100644 --- a/lib/Shapes.js +++ b/lib/Shapes.js @@ -2,12 +2,16 @@ * Shapes * * @copyright 2017, Kevin Lindsey + * @module Shapes */ import {Point2D} from "kld-affine"; import IntersectionArgs from "./IntersectionArgs.js"; +/** + * @namespace + */ const Shapes = {}; /** @@ -19,7 +23,7 @@ const Shapes = {}; * @param {number} p2y * @param {number} p3x * @param {number} p3y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) { return new IntersectionArgs("Bezier2", [ @@ -41,7 +45,7 @@ Shapes.quadraticBezier = function(p1x, p1y, p2x, p2y, p3x, p3y) { * @param {number} p3y * @param {number} p4x * @param {number} p4y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { return new IntersectionArgs("Bezier3", [ @@ -59,7 +63,7 @@ Shapes.cubicBezier = function(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { * @param {number} centerX * @param {number} centerY * @param {number} radius - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.circle = function(centerX, centerY, radius) { return new IntersectionArgs("Circle", [ @@ -76,7 +80,7 @@ Shapes.circle = function(centerX, centerY, radius) { * @param {number} centerY * @param {number} radiusX * @param {number} radiusY - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.ellipse = function(centerX, centerY, radiusX, radiusY) { return new IntersectionArgs("Ellipse", [ @@ -94,7 +98,7 @@ Shapes.ellipse = function(centerX, centerY, radiusX, radiusY) { * @param {number} p1y * @param {number} p2x * @param {number} p2y - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.line = function(p1x, p1y, p2x, p2y) { return new IntersectionArgs("Line", [ @@ -107,8 +111,8 @@ Shapes.line = function(p1x, p1y, p2x, p2y) { /** * path * - * @param {Array} segments - * @returns {IntersectionArgs} + * @param {Array} segments + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.path = function(segments) { return new IntersectionArgs("Path", segments); @@ -119,7 +123,7 @@ Shapes.path = function(segments) { * polygon * * @param {Array} coords - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.polygon = function(coords) { const points = []; @@ -136,7 +140,7 @@ Shapes.polygon = function(coords) { * polyline * * @param {Array} coords - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.polyline = function(coords) { const points = []; @@ -156,7 +160,7 @@ Shapes.polyline = function(coords) { * @param {number} y * @param {number} width * @param {number} height - * @returns {IntersectionArgs} + * @returns {module:kld-intersections.IntersectionArgs} */ Shapes.rectangle = function(x, y, width, height) { return new IntersectionArgs("Rectangle", [