{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 94e777aff5ec2effb4a0","webpack:///./src/Pt.ts","webpack:///./src/Util.ts","webpack:///./src/Op.ts","webpack:///./src/Num.ts","webpack:///./src/LinearAlgebra.ts","webpack:///./src/Bound.ts","webpack:///./src/Form.ts","webpack:///./src/Space.ts","webpack:///./src/Dom.ts","webpack:///./src/Typography.ts","webpack:///./src/Canvas.ts","webpack:///./src/Color.ts","webpack:///./src/Create.ts","webpack:///./src/Svg.ts","webpack:///./src/UI.ts","webpack:///./src/_lib.ts"],"names":[],"mappings":"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,GAAG,EAAC,EAAE,EAAC,GAAG;IAC3E,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IACxE,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG;IAC1E,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE;IAC3E,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC;IACxE,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG;IACxE,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAE,EAAE,EAAC,EAA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","file":"pts.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Pts\"] = factory();\n\telse\n\t\troot[\"Pts\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 15);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 94e777aff5ec2effb4a0","// Source code licensed under Apache License 2.0. \r\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\r\n\r\n\r\nimport {Util, Const} from \"./Util\";\r\nimport {Geom, Num} from \"./Num\";\r\nimport {Vec, Mat} from \"./LinearAlgebra\";\r\n\r\n\r\nexport interface IPt {\r\n  x?:number;\r\n  y?:number;\r\n  z?:number;\r\n  w?:number;\r\n}\r\n\r\nexport var PtBaseArray = Float32Array;\r\nexport type GroupLike = Group | Pt[];\r\nexport type PtLike = Pt | Float32Array | number[];\r\n\r\n\r\n/**\r\n * Pt is a subclass of Float32Array with additional properties and functions to support vector and geometric calculations.\r\n * See [Pt guide](../../guide/Pt-0200.html) for details\r\n */\r\nexport class Pt extends PtBaseArray implements IPt, Iterable<number> {\r\n\r\n  protected _id:string;\r\n\r\n  /**\r\n   * Create a Pt. If no parameter is provided, this will instantiate a Pt with 2 dimensions [0, 0].   \r\n   * \r\n   * Note that `new Pt(3)` will only instantiate Pt with length of 3 (ie, same as `new Float32Array(3)` ). If you need a Pt with 1 dimension of value 3, use `new Pt([3])`.\r\n   * @example `new Pt()`, `new Pt(1,2,3,4,5)`, `new Pt([1,2])`, `new Pt({x:0, y:1})`, `new Pt(pt)`\r\n   * @param args a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties\r\n   */\r\n  constructor(...args) {\r\n    if (args.length === 1 && typeof args[0] == \"number\") {\r\n      super( args[0] ); // init with the TypedArray's length. Needed this in order to make \".map\", \".slice\" etc work.\r\n    } else {\r\n      super( (args.length>0) ? Util.getArgs(args) : [0,0] );\r\n    }    \r\n  }\r\n\r\n  static make( dimensions:number, defaultValue:number=0, randomize:boolean=false ):Pt {\r\n    let p = new PtBaseArray(dimensions);\r\n    if (defaultValue) p.fill( defaultValue );\r\n    if (randomize) {\r\n      for (let i=0, len=p.length; i<len; i++) {\r\n        p[i] = p[i]*Math.random();\r\n      }\r\n    }\r\n    return new Pt( p );\r\n  }\r\n\r\n  get id():string { return this._id; }\r\n  set id( s:string ) { this._id = s; }\r\n\r\n  get x():number { return this[0]; }\r\n  get y():number { return this[1]; }\r\n  get z():number { return this[2]; }\r\n  get w():number { return this[3]; }\r\n\r\n  set x( n:number ) { this[0] = n; }\r\n  set y( n:number ) { this[1] = n; }\r\n  set z( n:number ) { this[2] = n; }\r\n  set w( n:number ) { this[3] = n; }\r\n  \r\n\r\n  /**\r\n   * Clone this Pt\r\n   */\r\n  clone():Pt {\r\n    return new Pt( this );\r\n  }\r\n\r\n\r\n  /**\r\n   * Check if another Pt is equal to this Pt, within a threshold\r\n   * @param p another Pt to compare with\r\n   * @param threshold a threshold value within which the two Pts are considered equal. Default is 0.000001.\r\n   */\r\n  equals( p:PtLike, threshold=0.000001 ):boolean {\r\n    for (let i=0, len=this.length; i<len; i++) {\r\n      if ( Math.abs(this[i]-p[i]) > threshold ) return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n\r\n  /**\r\n   * Update the values of this Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  to( ...args ):this {\r\n    let p = Util.getArgs( args );\r\n    for (let i=0, len=Math.min(this.length, p.length); i<len; i++) {\r\n      this[i] = p[i];\r\n    }\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Like `to()` but returns a new Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  $to( ...args ):Pt {\r\n    return this.clone().to( ...args );\r\n  }\r\n\r\n\r\n  /**\r\n   * Update the values of this Pt to point at a specific angle\r\n   * @param radian target angle in radian\r\n   * @param magnitude Optional magnitude if known. If not provided, it'll calculate and use this Pt's magnitude.\r\n   * @param anchorFromPt If `true`, translate to new position from current position. Default is `false` which update the position from origin (0,0);\r\n   */\r\n  toAngle( radian:number, magnitude?:number, anchorFromPt:boolean=false ):this {\r\n    let m = (magnitude!=undefined) ? magnitude : this.magnitude();\r\n    let change = [Math.cos(radian)*m, Math.sin(radian)*m];\r\n    return (anchorFromPt) ? this.add( change ) : this.to( change );\r\n  }\r\n\r\n\r\n  /**\r\n   * Create an operation using this Pt, passing this Pt into a custom function's first parameter. See the [Op guide](../../guide/Op-0400.html) for details.\r\n   * For example: `let myOp = pt.op( fn ); let result = myOp( [1,2,3] );`\r\n   * @param fn any function that takes a Pt as its first parameter\r\n   * @returns a resulting function that takes other parameters required in `fn`\r\n   */\r\n  op( fn:(p1:PtLike, ...rest:any[]) => any ): ( ...rest:any[] ) => any {\r\n    let self = this;\r\n    return ( ...params:any[] ) => {\r\n      return fn( self, ...params );\r\n    };\r\n  }\r\n\r\n\r\n  /**\r\n   * This combines a series of operations into an array. See `op()` for details.\r\n   * For example: `let myOps = pt.ops([fn1, fn2, fn3]); let results = myOps.map( (op) => op([1,2,3]) );`\r\n   * @param fns an array of functions for `op`\r\n   * @returns an array of resulting functions\r\n   */\r\n  ops( fns:((p1:PtLike, ...rest:any[]) => any)[] ): (( ...rest:any[] ) => any)[] {\r\n    let _ops = [];\r\n    for (let i=0, len=fns.length; i<len; i++) {\r\n      _ops.push( this.op( fns[i] ) );\r\n    }\r\n    return _ops;\r\n  }\r\n\r\n\r\n  /**\r\n   * Take specific dimensional values from this Pt and create a new Pt\r\n   * @param axis a string such as \"xy\" (use Const.xy) or an array to specify index for two dimensions\r\n   */\r\n  $take( axis:string|number[] ):Pt {\r\n    let p = [];\r\n    for (let i=0, len=axis.length; i<len; i++) {\r\n      p.push( this[axis[i]] || 0 );\r\n    }\r\n    return new Pt(p);\r\n  }\r\n\r\n\r\n  /**\r\n   * Concatenate this Pt with addition dimensional values and return as a new Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  $concat( ...args ):Pt {\r\n    return new Pt( this.toArray().concat( Util.getArgs( args ) ) );\r\n  }\r\n\r\n\r\n  /**\r\n   * Add scalar or vector values to this Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  add(...args): this { \r\n    (args.length === 1 && typeof args[0] == \"number\") ? Vec.add( this, args[0] ) : Vec.add( this, Util.getArgs(args) );\r\n    return this; \r\n  }\r\n\r\n\r\n  /**\r\n   * Like `add`, but returns result as a new Pt\r\n   */\r\n  $add(...args): Pt { return this.clone().add(...args); }\r\n\r\n\r\n  /**\r\n   * Subtract scalar or vector values from this Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  subtract(...args): this { \r\n    (args.length === 1 && typeof args[0] == \"number\") ? Vec.subtract( this, args[0] ) : Vec.subtract( this, Util.getArgs(args) );\r\n    return this; \r\n  }\r\n\r\n\r\n  /**\r\n   * Like `subtract`, but returns result as a new Pt\r\n   */\r\n  $subtract(...args): Pt { return this.clone().subtract(...args); }\r\n\r\n\r\n  /**\r\n   * Multiply scalar or vector values (as element-wise) with this Pt.\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  multiply(...args): this { \r\n    (args.length === 1 && typeof args[0] == \"number\") ? Vec.multiply( this, args[0] ) : Vec.multiply( this, Util.getArgs(args) );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Like `multiply`, but returns result as a new Pt\r\n   */\r\n  $multiply(...args): Pt { return this.clone().multiply(...args); }\r\n\r\n\r\n  /**\r\n   * Divide this Pt over scalar or vector values (as element-wise)\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  divide(...args): this { \r\n    (args.length === 1 && typeof args[0] == \"number\") ? Vec.divide( this, args[0] ) : Vec.divide( this, Util.getArgs(args) );\r\n    return this; \r\n  }\r\n\r\n\r\n  /**\r\n   * Like `divide`, but returns result as a new Pt\r\n   */\r\n  $divide(...args): Pt { return this.clone().divide(...args); }\r\n\r\n\r\n  /**\r\n   * Get the sqaured distance (magnitude) of this Pt from origin\r\n   */\r\n  magnitudeSq():number {  return Vec.dot( this, this ); }\r\n\r\n\r\n  /**\r\n   * Get the distance (magnitude) of this Pt from origin\r\n   */\r\n  magnitude():number { return Vec.magnitude( this ); }\r\n\r\n\r\n  /**\r\n   * Convert to a unit vector, which is a normalized vector whose magnitude equals 1.\r\n   * @param magnitude Optional: if the magnitude is known, pass it as a parameter to avoid duplicate calculation.\r\n   */\r\n  unit( magnitude:number=undefined ):Pt {\r\n    Vec.unit( this, magnitude );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a unit vector from this Pt\r\n   */\r\n  $unit( magnitude:number=undefined ):Pt { return this.clone().unit( magnitude ); }\r\n\r\n\r\n  /**\r\n   * Dot product of this Pt and another Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  dot( ...args ):number { return Vec.dot( this, Util.getArgs(args) ); }\r\n\r\n\r\n  /**\r\n   * 2D Cross product of this Pt and another Pt. Return results as a new Pt.\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  cross2D( ...args ):number { return Vec.cross2D( this, Util.getArgs(args) ); }\r\n\r\n  \r\n  /**\r\n   * 3D Cross product of this Pt and another Pt. Return results as a new Pt.\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  $cross( ...args ): Pt { return Vec.cross( this, Util.getArgs( args ) ); }\r\n\r\n\r\n  /**\r\n   * Calculate vector projection of this Pt on another Pt. Returns result as a new Pt.\r\n   * @param p a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  $project( p:Pt ):Pt {\r\n    let m = p.magnitude();\r\n    let a = this.$unit();\r\n    let b = p.$divide(m);\r\n    let dot = a.dot( b );\r\n    return a.multiply( m * dot );\r\n  }\r\n\r\n\r\n  /**\r\n   * Absolute values for all values in this pt\r\n   */\r\n  abs():Pt {\r\n    Vec.abs( this );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a new Pt with absolute values of this Pt\r\n   */\r\n  $abs():Pt {\r\n    return this.clone().abs();\r\n  }\r\n\r\n\r\n  /**\r\n   * Floor values for all values in this pt\r\n   */\r\n  floor():Pt {\r\n    Vec.floor( this );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a new Pt with floor values of this Pt\r\n   */\r\n  $floor():Pt {\r\n    return this.clone().floor();\r\n  }\r\n\r\n\r\n  /**\r\n   * Ceil values for all values in this pt\r\n   */\r\n  ceil():Pt {\r\n    Vec.ceil( this );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a new Pt with ceil values of this Pt\r\n   */\r\n  $ceil():Pt {\r\n    return this.clone().ceil();\r\n  }\r\n\r\n\r\n  /**\r\n   * Round values for all values in this pt\r\n   */\r\n  round():Pt {\r\n    Vec.round( this );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a new Pt with round values of this Pt\r\n   */\r\n  $round():Pt {\r\n    return this.clone().round();\r\n  }\r\n\r\n\r\n  /**\r\n   * Find the minimum value across all dimensions in this Pt\r\n   * @returns an object with `value` and `index` which returns the minimum value and its dimensional index\r\n   */\r\n  minValue():{value:number, index:number} {\r\n    return Vec.min( this );\r\n  }\r\n\r\n\r\n  /**\r\n   * Find the maximum value across all dimensions in this Pt\r\n   * @returns an object with `value` and `index` which returns the maximum value and its dimensional index\r\n   */\r\n  maxValue():{value:number, index:number} {\r\n    return Vec.max( this );\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a new Pt that has the minimum dimensional values of this Pt and another Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  $min( ...args ):Pt {\r\n    let p = Util.getArgs( args );\r\n    let m = this.clone();\r\n    for (let i=0, len=Math.min( this.length, p.length ); i<len; i++) {\r\n      m[i] = Math.min( this[i], p[i] );\r\n    }\r\n    return m;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a new Pt that has the maximum dimensional values of this Pt and another Pt\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  $max( ...args ):Pt {\r\n    let p = Util.getArgs( args );\r\n    let m = this.clone();\r\n    for (let i=0, len=Math.min( this.length, p.length ); i<len; i++) {\r\n      m[i] = Math.max( this[i], p[i] );\r\n    }\r\n    return m;\r\n  }\r\n  \r\n\r\n  /**\r\n   * Get angle of this vector from origin\r\n   * @param axis a string such as \"xy\" (use Const.xy) or an array to specify index for two dimensions\r\n   */\r\n  angle( axis:string|number[]=Const.xy ):number {\r\n    return Math.atan2( this[axis[1]], this[axis[0]] );\r\n  }\r\n\r\n\r\n  /**\r\n   * Get the angle between this and another Pt\r\n   * @param p the other Pt\r\n   * @param axis a string such as \"xy\" (use Const.xy) or an array to specify index for two dimensions\r\n   */\r\n  angleBetween( p:Pt, axis:string|number[]=Const.xy ):number {\r\n    return Geom.boundRadian( this.angle(axis) ) - Geom.boundRadian( p.angle(axis) );\r\n  }\r\n\r\n\r\n  /**\r\n   * Scale this Pt from origin or from an anchor point\r\n   * @param scale scale ratio\r\n   * @param anchor optional anchor point to scale from\r\n   */\r\n  scale( scale:number|number[]|PtLike, anchor?:PtLike ) {    \r\n    Geom.scale( this, scale, anchor || Pt.make( this.length, 0) );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Rotate this Pt from origin or from an anchor point in 2D\r\n   * @param angle rotate angle\r\n   * @param anchor optional anchor point to scale from\r\n   * @param axis optional string such as \"yz\" to specify a 2D plane\r\n   */\r\n  rotate2D( angle:number, anchor?:PtLike, axis?:string ) {    \r\n    Geom.rotate2D( this, angle, anchor || Pt.make( this.length, 0), axis );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Shear this Pt from origin or from an anchor point in 2D\r\n   * @param shear shearing value which can be a number or an array of 2 numbers\r\n   * @param anchor optional anchor point to scale from\r\n   * @param axis optional string such as \"yz\" to specify a 2D plane\r\n   */\r\n  shear2D( scale:number|number[]|PtLike, anchor?:PtLike, axis?:string) {\r\n    Geom.shear2D( this, scale, anchor || Pt.make( this.length, 0), axis );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Reflect this Pt along a 2D line\r\n   * @param line a Group of 2 Pts that defines a line for reflection\r\n   * @param axis optional axis such as \"yz\" to define a 2D plane of reflection\r\n   */\r\n  reflect2D( line:GroupLike, axis?:string):this {\r\n    Geom.reflect2D( this, line, axis );\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * A string representation of this Pt: \"Pt(1, 2, 3)\"\r\n   */\r\n  toString():string {\r\n    return `Pt(${ this.join(\", \")})`;\r\n  }\r\n\r\n\r\n  /**\r\n   * Convert this Pt to a javascript Array\r\n   */\r\n  toArray():number[] {\r\n    return [].slice.call( this );\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * A Group is a subclass of Array. It should onnly contain Pt instances. You can think of it as an array of arrays (Float32Arrays to be specific).\r\n * See [Group guide](../../guide/Group-0300.html) for details\r\n */\r\nexport class Group extends Array<Pt> {\r\n\r\n  protected _id:string;\r\n  \r\n  constructor(...args:Pt[]) {\r\n    super(...args);\r\n  }\r\n\r\n  get id():string { return this._id; }\r\n  set id( s:string ) { this._id = s; }\r\n\r\n  /** The first Pt in this group */\r\n  get p1():Pt { return this[0]; }\r\n\r\n  /** The second Pt in this group */\r\n  get p2():Pt { return this[1]; }\r\n\r\n  /** The third Pt in this group */\r\n  get p3():Pt { return this[2]; }\r\n\r\n  /** The forth Pt in this group */\r\n  get p4():Pt { return this[3]; }\r\n\r\n    /** The last Pt in this group */\r\n  get q1():Pt { return this[this.length-1]; }\r\n\r\n  /** The second-last Pt in this group */\r\n  get q2():Pt { return this[this.length-2]; }\r\n\r\n  /** The third-last Pt in this group */\r\n  get q3():Pt { return this[this.length-3]; }\r\n\r\n  /** The forth-last Pt in this group */\r\n  get q4():Pt { return this[this.length-4]; }\r\n\r\n  \r\n\r\n\r\n  /**\r\n   * Depp clone this group and its Pts\r\n   */\r\n  clone():Group {\r\n    let group = new Group();   \r\n    for (let i=0, len=this.length; i<len; i++) {\r\n      group.push( this[i].clone() );\r\n    }\r\n    return group;\r\n  }\r\n\r\n\r\n  /**\r\n   * Convert an array of numeric arrays into a Group of Pts\r\n   * @param list an array of numeric arrays\r\n   * @example `Group.fromArray( [[1,2], [3,4], [5,6]] )`\r\n   */\r\n  static fromArray( list:PtLike[] ):Group {\r\n    let g = new Group();\r\n    for (let i=0, len=list.length; i<len; i++) {\r\n      let p = (list[i] instanceof Pt) ? list[i] as Pt : new Pt(list[i]);\r\n      g.push( p );\r\n    }\r\n    return g;\r\n  }\r\n\r\n\r\n  /**\r\n   * Convert an array of Pts into a Group.\r\n   * @param list an array of Pts\r\n   */\r\n  static fromPtArray( list:GroupLike ):Group {\r\n    return Group.from( list ) as Group;\r\n  }\r\n\r\n\r\n  /**\r\n   * Split this Group into an array of sub-groups\r\n   * @param chunkSize number of items per sub-group\r\n   * @param stride forward-steps after each sub-group\r\n   * @param loopBack if `true`, always go through the array till the end and loop back to the beginning to complete the segments if needed\r\n   */\r\n  split( chunkSize:number, stride?:number, loopBack:boolean=false ):Group[] {\r\n    let sp = Util.split( this, chunkSize, stride, loopBack );\r\n    return sp as Group[];\r\n  }\r\n\r\n\r\n  /**\r\n   * Insert a Pt into this group\r\n   * @param pts Another group of Pts\r\n   * @param index the index position to insert into\r\n   */\r\n  insert( pts:GroupLike, index=0 ):this {\r\n    Group.prototype.splice.apply( this, [index, 0, ...pts] );\r\n    return this;\r\n  }\r\n  \r\n\r\n  /**\r\n   * Like Array's splice function, with support for negative index and a friendlier name.\r\n   * @param index start index, which can be negative (where -1 is at index 0, -2 at index 1, etc)\r\n   * @param count number of items to remove\r\n   * @returns The items that are removed. \r\n   */\r\n  remove( index=0, count:number=1 ):Group {\r\n    let param = (index<0) ? [index*-1 - 1, count] : [index, count];\r\n    return Group.prototype.splice.apply( this, param );\r\n  }\r\n\r\n\r\n  /**\r\n   * Split this group into an array of sub-group segments\r\n   * @param pts_per_segment number of Pts in each segment\r\n   * @param stride forward-step to take\r\n   * @param loopBack if `true`, always go through the array till the end and loop back to the beginning to complete the segments if needed\r\n   */\r\n  segments( pts_per_segment:number=2, stride:number=1, loopBack:boolean=false ):Group[] { \r\n    return this.split(pts_per_segment, stride, loopBack); \r\n  }\r\n\r\n\r\n  /**\r\n   * Get all the line segments (ie, edges in a graph) of this group\r\n   */\r\n  lines():Group[] { return this.segments(2, 1); }\r\n\r\n\r\n  /**\r\n   * Find the centroid of this group's Pts, which is the average middle point.\r\n   */\r\n  centroid(): Pt {\r\n    return Geom.centroid( this );\r\n  }\r\n\r\n  \r\n  /**\r\n   * Find the rectangular bounding box of this group's Pts.\r\n   * @returns a Group of 2 Pts representing the top-left and bottom-right of the rectangle\r\n   */\r\n  boundingBox():Group {\r\n    return Geom.boundingBox( this );\r\n  }\r\n\r\n\r\n  /**\r\n   * Anchor all the Pts in this Group using a target Pt as origin. (ie, subtract all Pt with the target anchor to get a relative position). All the Pts' values will be updated.\r\n   * @param ptOrIndex a Pt, or a numeric index to target a specific Pt in this Group\r\n   */\r\n  anchorTo( ptOrIndex:PtLike|number=0 ) { Geom.anchor( this, ptOrIndex, \"to\" ); }\r\n\r\n\r\n  /**\r\n   * Anchor all the Pts in this Group by its absolute position from a target Pt. (ie, add all Pt with the target anchor to get an absolute position).  All the Pts' values will be updated.\r\n   * @param ptOrIndex a Pt, or a numeric index to target a specific Pt in this Group\r\n   */\r\n  anchorFrom( ptOrIndex:PtLike|number=0 ) { Geom.anchor( this, ptOrIndex, \"from\" ); }\r\n\r\n\r\n  /**\r\n   * Create an operation using this Group, passing this Group into a custom function's first parameter.  See the [Op guide](../../guide/Op-0400.html) for details.\r\n   * For example: `let myOp = group.op( fn ); let result = myOp( [1,2,3] );`\r\n   * @param fn any function that takes a Group as its first parameter\r\n   * @returns a resulting function that takes other parameters required in `fn`\r\n   */\r\n  op( fn:(g1:GroupLike, ...rest:any[]) => any ): ( ...rest:any[] ) => any {\r\n    let self = this;\r\n    return ( ...params:any[] ) => {\r\n      return fn( self, ...params );\r\n    };\r\n  }\r\n\r\n\r\n  /**\r\n   * This combines a series of operations into an array. See `op()` for details.\r\n   * For example: `let myOps = pt.ops([fn1, fn2, fn3]); let results = myOps.map( (op) => op([1,2,3]) );`\r\n   * @param fns an array of functions for `op`\r\n   * @returns an array of resulting functions\r\n   */\r\n  ops( fns:((g1:GroupLike, ...rest:any[]) => any)[] ): (( ...rest:any[] ) => any)[] {\r\n    let _ops = [];\r\n    for (let i=0, len=fns.length; i<len; i++) {\r\n      _ops.push( this.op( fns[i] ) );\r\n    }\r\n    return _ops;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get an interpolated point on the line segments defined by this Group\r\n   * @param t a value between 0 to 1 usually\r\n   */\r\n  interpolate( t:number ):Pt {\r\n    t = Num.clamp( t, 0, 1 );\r\n    let chunk = this.length-1;\r\n    let tc = 1/(this.length-1);\r\n    let idx = Math.floor( t / tc );\r\n    return Geom.interpolate( this[idx], this[ Math.min( this.length-1, idx+1)], (t - idx*tc) * chunk );\r\n  }\r\n\r\n\r\n  /**\r\n   * Move every Pt's position by a specific amount. Same as `add`.\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  moveBy( ...args ):this {\r\n    return this.add( ...args );\r\n  }\r\n\r\n  /**\r\n   * Move the first Pt in this group to a specific position, and move all the other Pts correspondingly\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  moveTo( ...args ):this {\r\n    let d = new Pt( Util.getArgs(args) ).subtract( this[0] );\r\n    this.moveBy( d );\r\n    return this; \r\n  }\r\n\r\n\r\n  /**\r\n   * Scale this group's Pts from an anchor point. Default anchor point is the first Pt in this group.\r\n   * @param scale scale ratio\r\n   * @param anchor optional anchor point to scale from\r\n   */\r\n  scale( scale:number|number[]|PtLike, anchor?:PtLike ):this {    \r\n    for (let i=0, len=this.length; i<len; i++) {\r\n      Geom.scale( this[i], scale, anchor || this[0] );\r\n    }\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Rotate this group's Pt from an anchor point in 2D. Default anchor point is the first Pt in this group.\r\n   * @param angle rotate angle\r\n   * @param anchor optional anchor point to scale from\r\n   * @param axis optional string such as \"yz\" to specify a 2D plane\r\n   */\r\n  rotate2D( angle:number, anchor?:PtLike, axis?:string ):this {   \r\n    for (let i=0, len=this.length; i<len; i++) {\r\n      Geom.rotate2D( this[i], angle, anchor || this[0], axis );\r\n    } \r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Shear this group's Pt from an anchor point in 2D. Default anchor point is the first Pt in this group.\r\n   * @param shear shearing value which can be a number or an array of 2 numbers\r\n   * @param anchor optional anchor point to scale from\r\n   * @param axis optional string such as \"yz\" to specify a 2D plane\r\n   */\r\n  shear2D( scale:number|number[]|PtLike, anchor?:PtLike, axis?:string):this {\r\n    for (let i=0, len=this.length; i<len; i++) {\r\n      Geom.shear2D( this[i], scale, anchor || this[0], axis );\r\n    }\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Reflect this group's Pts along a 2D line. Default anchor point is the first Pt in this group.\r\n   * @param line a Group of 2 Pts that defines a line for reflection\r\n   * @param axis optional axis such as \"yz\" to define a 2D plane of reflection\r\n   */\r\n  reflect2D( line:GroupLike, axis?:string):this {\r\n    for (let i=0, len=this.length; i<len; i++) {\r\n      Geom.reflect2D( this[i], line, axis );\r\n    }\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Sort this group's Pts by values in a specific dimension\r\n   * @param dim dimensional index\r\n   * @param desc if true, sort descending. Default is false (ascending)\r\n   */\r\n  sortByDimension( dim:number, desc:boolean=false ):this {\r\n    return this.sort( (a, b) => (desc) ? b[dim] - a[dim] : a[dim] - b[dim] );\r\n  }\r\n\r\n\r\n  /**\r\n   * Update each Pt in this Group with a Pt function\r\n   * @param ptFn string name of an existing Pt function. Note that the function must return Pt.\r\n   * @param args arguments for the function specified in ptFn\r\n   */\r\n  forEachPt( ptFn:string, ...args ):this {\r\n    if (!this[0][ptFn]) {\r\n      Util.warn( `${ptFn} is not a function of Pt` );\r\n      return this;\r\n    }\r\n    for (let i=0, len=this.length; i<len; i++) {\r\n      this[i] = this[i][ptFn]( ...args );\r\n    }\r\n    return this;\r\n  }\r\n\r\n\r\n  /**\r\n   * Add scalar or vector values to this group's Pts.\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  add( ...args ):this {\r\n    return this.forEachPt( \"add\", ...args );\r\n  }\r\n\r\n\r\n  /**\r\n   * Subtract scalar or vector values from this group's Pts.\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  subtract( ...args ):this {\r\n    return this.forEachPt( \"subtract\", ...args );\r\n  }\r\n\r\n\r\n  /**\r\n   * Multiply scalar or vector values (as element-wise) with this group's Pts.\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  multiply( ...args ):this {\r\n    return this.forEachPt( \"multiply\", ...args );\r\n  }\r\n  \r\n\r\n  /**\r\n   * Divide this group's Pts over scalar or vector values (as element-wise)\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  divide( ...args ):this {\r\n    return this.forEachPt( \"divide\", ...args );\r\n  }\r\n\r\n\r\n  /**\r\n   * Apply this group as a matrix and calculate matrix addition\r\n   * @param g a scalar number, an array of numeric arrays, or a group of Pt\r\n   * @returns a new Group\r\n   */\r\n  $matrixAdd( g:GroupLike|number[][]|number ):Group {\r\n    return Mat.add( this, g );\r\n  }\r\n\r\n\r\n  /**\r\n   * Apply this group as a matrix and calculate matrix multiplication\r\n   * @param g a scalar number, an array of numeric arrays, or a Group of K Pts, each with N dimensions (K-rows, N-columns) -- or if transposed is true, then N Pts with K dimensions\r\n   * @param transposed (Only applicable if it's not elementwise multiplication) If true, then a and b's columns should match (ie, each Pt should have the same dimensions). Default is `false`.\r\n   * @param elementwise if true, then the multiplication is done element-wise. Default is `false`.\r\n   * @returns If not elementwise, this will return a new  Group with M Pt, each with N dimensions (M-rows, N-columns).\r\n   */\r\n  $matrixMultiply( g:GroupLike|number, transposed:boolean=false, elementwise:boolean=false ):Group {\r\n    return Mat.multiply( this, g, transposed , elementwise);\r\n  }\r\n\r\n\r\n  /**\r\n   * Zip one slice of an array of Pt. Imagine the Pts are organized in rows, then this function will take the values in a specific column.\r\n   * @param idx index to zip at\r\n   * @param defaultValue a default value to fill if index out of bound. If not provided, it will throw an error instead.\r\n   */\r\n  zipSlice( index:number, defaultValue:number|boolean = false ):Pt {\r\n    return Mat.zipSlice( this, index, defaultValue );\r\n  }\r\n\r\n  /**\r\n   * Zip a group of Pt. eg, [[1,2],[3,4],[5,6]] => [[1,3,5],[2,4,6]]\r\n   * @param defaultValue a default value to fill if index out of bound. If not provided, it will throw an error instead.\r\n   * @param useLongest If true, find the longest list of values in a Pt and use its length for zipping. Default is false, which uses the first item's length for zipping.\r\n   */\r\n  $zip( defaultValue:number|boolean = undefined, useLongest=false ):Group {\r\n    return Mat.zip( this, defaultValue, useLongest );\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a string representation of this group\r\n   */\r\n  toString():string {\r\n    return \"Group[ \"+ this.reduce( (p, c) => p+c.toString()+\" \", \"\" )+\" ]\";\r\n  }\r\n\r\n\r\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Pt.ts","// Source code licensed under Apache License 2.0.\r\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\r\n\r\n\r\nimport {Group} from \"./Pt\";\r\n\r\n\r\n/**\r\n * Various constant values for enumerations and calculations\r\n */\r\nexport const Const = {\r\n  xy: \"xy\",\r\n  yz: \"yz\",\r\n  xz: \"xz\",\r\n  xyz: \"xyz\",\r\n\r\n  horizontal: 0,\r\n  vertical: 1,\r\n\r\n  /* represents identical point or value */\r\n  identical: 0,\r\n\r\n  /* represents right position or direction */\r\n  right: 4,\r\n\r\n  /* represents bottom right position or direction */\r\n  bottom_right: 5,\r\n\r\n  /* represents bottom position or direction */\r\n  bottom: 6,\r\n\r\n  /* represents bottom left position or direction */\r\n  bottom_left: 7,\r\n\r\n  /* represents left position or direction */\r\n  left: 8,\r\n\r\n  /* represents top left position or direction */\r\n  top_left: 1,\r\n\r\n  /* represents top position or direction */\r\n  top: 2,\r\n\r\n  /* represents top right position or direction */\r\n  top_right: 3,\r\n\r\n  /* represents an arbitrary very small number. It is set as 0.0001 here. */\r\n  epsilon : 0.0001,\r\n\r\n  /* represents Number.MAX_VALUE */\r\n  max: Number.MAX_VALUE,\r\n\r\n  /* represents Number.MIN_VALUE */\r\n  min: Number.MIN_VALUE,\r\n\r\n  /* pi radian (180 deg) */\r\n  pi: Math.PI,\r\n\r\n  /* two pi radian (360deg) */\r\n  two_pi : 6.283185307179586,\r\n\r\n  /* half pi radian (90deg) */\r\n  half_pi : 1.5707963267948966,\r\n\r\n  /* pi/4 radian (45deg) */\r\n  quarter_pi : 0.7853981633974483,\r\n\r\n  /* pi/180: 1 degree in radian */\r\n  one_degree: 0.017453292519943295,\r\n\r\n  /* multiply this constant with a radian to get a degree */\r\n  rad_to_deg: 57.29577951308232,\r\n\r\n  /* multiply this constant with a degree to get a radian */\r\n  deg_to_rad: 0.017453292519943295,\r\n\r\n  /* Gravity acceleration (unit: m/s^2) and gravity force (unit: Newton) on 1kg of mass. */\r\n  gravity: 9.81,\r\n\r\n  /* 1 Newton: 0.10197 Kilogram-force */\r\n  newton: 0.10197,\r\n\r\n  /* Gaussian constant (1 / Math.sqrt(2 * Math.PI)) */\r\n  gaussian: 0.3989422804014327\r\n\r\n};\r\n\r\n\r\n/**\r\n * Util provides various helper functions\r\n */\r\nexport class Util {\r\n\r\n  static warnLevel:\"error\"|\"warn\"|\"default\" = \"default\";\r\n\r\n  /**\r\n   * Convert different kinds of parameters (arguments, array, object) into an array of numbers\r\n   * @param args a list of numbers, an array of number, or an object with {x,y,z,w} properties\r\n   */\r\n  static getArgs( args:any[] ):Array<number> {\r\n    if (args.length<1) return [];\r\n\r\n    let pos = [];\r\n    \r\n    let isArray = Array.isArray( args[0] ) || ArrayBuffer.isView( args[0] );\r\n    \r\n    // positional arguments: x,y,z,w,...\r\n    if (typeof args[0] === 'number') {\r\n      pos = Array.prototype.slice.call( args );\r\n\r\n    // as an object of {x, y?, z?, w?}\r\n    } else if (typeof args[0] === 'object' && !isArray ) {\r\n      let a = [\"x\", \"y\", \"z\", \"w\"];\r\n      let p = args[0];\r\n      for (let i=0; i<a.length; i++) {\r\n        if ( (p.length && i>=p.length) || !(a[i] in p) ) break; // check for length and key exist\r\n        pos.push( p[ a[i] ] );\r\n      }\r\n\r\n    // as an array of values\r\n    } else if (isArray) {\r\n      pos = [].slice.call( args[0] );\r\n    }\r\n    \r\n    return pos;\r\n  }\r\n\r\n\r\n  /**\r\n   * Send a warning message based on Util.warnLevel global setting. This allows you to dynamically set whether minor errors should be thrown or printed in console or muted.\r\n   * @param message any error or warning message\r\n   * @param defaultReturn optional return value\r\n   */\r\n  static warn( message:string=\"error\", defaultReturn:any=undefined ):any {\r\n    if (Util.warnLevel == \"error\") {\r\n      throw new Error( message );\r\n    } else if (Util.warnLevel == \"warn\") {\r\n      console.warn( message );\r\n    }\r\n    return defaultReturn;\r\n  \r\n  }\r\n\r\n\r\n  static randomInt( range:number, start:number=0 ) {\r\n    return Math.floor( Math.random()*range ) + start;\r\n  }\r\n\r\n  /**\r\n   * Split an array into chunks of sub-array\r\n   * @param pts an array \r\n   * @param size chunk size, ie, number of items in a chunk\r\n   * @param stride optional parameter to \"walk through\" the array in steps\r\n   * @param loopBack if `true`, always go through the array till the end and loop back to the beginning to complete the segments if needed\r\n   */\r\n  static split( pts:any[], size:number, stride?:number, loopBack:boolean=false ):any[][] {\r\n    let st = stride || size;\r\n    let chunks = [];\r\n    for (let i=0; i<pts.length; i++) {\r\n      if (i*st+size > pts.length) {\r\n        if (loopBack) {\r\n          let g = pts.slice(i*st);\r\n          g = g.concat( pts.slice( 0, (i*st+size)%size ) );\r\n          chunks.push( g );\r\n        } else {\r\n          break;\r\n        }\r\n      } else {\r\n        chunks.push( pts.slice(i*st, i*st+size ) );\r\n      }\r\n    }\r\n    return chunks;\r\n  }\r\n\r\n\r\n  /**\r\n   * Flatten an array of arrays such as Group[] to a flat Array or Group\r\n   * @param pts an array, usually an array of Groups\r\n   * @param flattenAsGroup a boolean to specify whether the return type should be a Group or Array. Default is `true` which returns a Group.\r\n   */\r\n  static flatten( pts:any[], flattenAsGroup:boolean=true ) {\r\n    let arr = (flattenAsGroup) ? new Group() : new Array();\r\n    return arr.concat.apply(arr, pts);\r\n  }\r\n\r\n\r\n    /**\r\n   * Given two arrays of object<T>, and a function that operate on two object<T>, return an array of T  \r\n   * @param a an array of object<T>, eg [ Group, Group, ... ]\r\n   * @param b another array of object<T>\r\n   * @param op a function that takes two parameters (a, b) and returns a T\r\n   */\r\n  static combine<T>( a:T[], b:T[], op:(a:T, b:T) => T ):T[] {\r\n    let result = [];\r\n    for (let i=0, len=a.length; i<len; i++) {\r\n      for (let k=0, lenB=b.length; k<lenB; k++) {\r\n        result.push( op(a[i], b[k]) );\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n\r\n  /**\r\n   * Zip arrays. eg, [[1,2],[3,4],[5,6]] => [[1,3,5],[2,4,6]]\r\n   * @param arrays an array of arrays \r\n   */\r\n  static zip( ...arrays:Array<any>[] ) {\r\n    let z = [];\r\n    for (let i=0, len=arrays[0].length; i<len; i++) {\r\n      let p = [];\r\n      for (let k=0; k<arrays.length; k++) {\r\n        p.push( arrays[k][i] );\r\n      }\r\n      z.push( p );\r\n    }\r\n    return z;\r\n  }\r\n\r\n\r\n  /**\r\n   * Create a convenient stepper. This returns a function which you can call repeatedly to step a counter.\r\n   * @param max Maximum of the stepper range. The resulting stepper will return (min to max-1) values.\r\n   * @param min Minimum of the stepper range. Default is 0.\r\n   * @param stride Stride of the step. Default is 1.\r\n   * @param callback An optional callback function( step ), which will be called each tiem when stepper function is called.\r\n   * @example `let counter = stepper(100); let c = counter(); c = counter(); ...`\r\n   * @returns a function which will increment the stepper and return its value at each call.\r\n   */\r\n  static stepper( max:number, min:number=0, stride:number=1, callback?:(n:number) => void ):(() => number) {\r\n    let c = min;\r\n    return function() {\r\n      c += stride;\r\n      if (c >= max) {\r\n        c = min + (c-max);\r\n      }\r\n      if (callback) callback(c);\r\n      return c;\r\n    };\r\n  }\r\n\r\n\r\n  /**\r\n   * A convenient way to step through a range. Same as `for (i=0; i<range; i++)`, except this also stores the resulting return values at each step and return them as an array.\r\n   * @param range a range to step through\r\n   * @param fn a callback function(index). If this function returns a value, it will be stored at each step\r\n   * @returns an array of returned values at each step  \r\n   */\r\n  static forRange( fn:(index:number) => any, range:number, start:number=0, step:number=1  ):any[] {\r\n    let temp = [];\r\n    for (let i=start, len=range; i<len; i+=step) {\r\n      temp[i] = fn(i);\r\n    }\r\n    return temp;\r\n  }\r\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Util.ts","// Source code licensed under Apache License 2.0. \n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport {Util} from \"./Util\";\nimport {Geom, Num} from \"./Num\";\nimport {Pt, PtLike, Group, GroupLike} from \"./Pt\";\nimport {Mat} from \"./LinearAlgebra\";\n\n\nlet _errorLength = (obj, param:number|string=\"expected\") => Util.warn( \"Group's length is less than \"+param, obj  );\nlet _errorOutofBound = (obj, param:number|string=\"\") => Util.warn( `Index ${param} is out of bound in Group`, obj  );\n\n\n/**\n * Line class provides static functions to create and operate on lines. A line is usually represented as a Group of 2 Pts.\n * You can use the static function as-is, or apply the `op` method in Group or Pt to many of these functions.\n * See [Op guide](../../guide/Op-0400.html) for details.\n */\nexport class Line {\n\n  /**\n   * Create a line by \"drawing\" from an anchor point, given an angle and a magnitude\n   * @param anchor an anchor Pt\n   * @param angle an angle in radian\n   * @param magnitude magnitude of the line\n   * @return a Group of 2 Pts representing a line segement\n   */\n  static fromAngle( anchor:PtLike, angle:number, magnitude:number ):Group {\n    let g = new Group( new Pt(anchor), new Pt(anchor) );\n    g[1].toAngle( angle, magnitude, true );\n    return g;\n  }\n\n\n  /**\n   * Calculate the slope of a line\n   * @param p1 line's first end point\n   * @param p2 line's second end point\n   */\n  static slope( p1:PtLike|number[], p2:PtLike|number[] ):number {\n    return (p2[0] - p1[0] === 0) ? undefined : (p2[1] - p1[1]) / (p2[0] - p1[0]);\n  }\n\n\n  /**\n   * Calculate the slope and xy intercepts of a line\n   * @param p1 line's first end point\n   * @param p2 line's second end point\n   * @returns an object with `slope`, `xi`, `yi` properties \n   */\n  static intercept( p1:PtLike|number[], p2:PtLike|number[] ):{ slope:number, xi:number, yi:number } {\n    if (p2[0] - p1[0] === 0) {\n      return undefined;\n    } else {\n      let m = (p2[1] - p1[1]) / (p2[0] - p1[0]);\n      let c = p1[1] - m * p1[0];\n      return { slope: m, yi: c, xi: (m===0) ? undefined : -c/m };\n    }\n  }\n\n\n  /**\n   * Given a 2D path and a point, find whether the point is on left or right side of the line\n   * @param line  a Group of at least 2 Pts\n   * @param pt a Pt\n   * @returns a negative value if on left and a positive value if on right. If collinear, then the return value is 0.\n   */\n  static sideOfPt2D( line:GroupLike, pt:PtLike ):number {\n    return (line[1][0] - line[0][0]) * (pt[1] - line[0][1]) - (pt[0] - line[0][0]) * (line[1][1] - line[0][1]);\n  }\n\n\n  /**\n   * Check if three Pts are collinear, ie, on the same straight path.\n   * @param p1 first Pt\n   * @param p2 second Pt\n   * @param p3 third Pt\n   * @param threshold a threshold where a smaller value means higher precision threshold for the straight line. Default is 0.01.\n   */\n  static collinear( p1:PtLike|number[], p2:PtLike|number[], p3:PtLike|number[], threshold:number=0.01 ):boolean {\n    // Use cross product method\n    let a = new Pt(0,0,0).to(p1).$subtract( p2 );\n    let b = new Pt(0,0,0).to(p1).$subtract( p3 );    \n    return a.$cross( b ).divide(1000).equals( new Pt(0,0,0), threshold );\n  }\n\n\n  /**\n   * Get magnitude of a line segment\n   * @param line a Group of at least 2 Pts\n   */\n  static magnitude( line:GroupLike ):number {\n    return (line.length >= 2) ? line[1].$subtract( line[0] ).magnitude() : 0;\n  }\n\n\n  /**\n   * Get squared magnitude of a line segment\n   * @param line a Group of at least 2 Pts\n   */\n  static magnitudeSq( line:GroupLike ):number {\n    return (line.length >= 2) ? line[1].$subtract( line[0] ).magnitudeSq() : 0;\n  }\n\n\n  /**\n   * Find a point on a line that is perpendicular (shortest distance) to a target point\n   * @param pt a target Pt \n   * @param ln a group of Pts that defines a line\n   * @param asProjection if true, this returns the projection vector instead. Default is false.\n   * @returns a Pt on the line that is perpendicular to the target Pt, or a projection vector if `asProjection` is true.\n   */\n  static perpendicularFromPt( line:GroupLike, pt:PtLike|number[], asProjection:boolean=false ):Pt {\n    if (line[0].equals(line[1])) return undefined;\n    let a = line[0].$subtract( line[1] );\n    let b = line[1].$subtract( pt );\n    let proj = b.$subtract( a.$project( b ) );\n\n    return (asProjection) ? proj : proj.$add( pt );\n  }\n\n\n  /**\n   * Given a line and a point, find the shortest distance from the point to the line\n   * @param line a Group of 2 Pts\n   * @param pt a Pt\n   * @see `Line.perpendicularFromPt`\n   */\n  static distanceFromPt( line:GroupLike, pt:PtLike|number[] ):number {\n    return Line.perpendicularFromPt( line, pt, true ).magnitude();\n  }\n\n\n  /**\n   * Given two lines as rays (infinite lines), find their intersection point if any.\n   * @param la a Group of 2 Pts representing a ray\n   * @param lb a Group of 2 Pts representing a ray\n   * @returns an intersection Pt or undefined if no intersection\n   */\n  static intersectRay2D( la:GroupLike, lb:GroupLike ):Pt {\n\n    let a = Line.intercept( la[0], la[1] );\n    let b = Line.intercept( lb[0], lb[1] );\n\n    let pa = la[0];\n    let pb = lb[0];\n\n    if (a == undefined) {\n      if (b == undefined) return undefined;\n      // one of them is vertical line, while the other is not, so they will intersect\n      let y1 = -b.slope *  (pb[0] - pa[0]) + pb[1]; // -slope * x + y\n      return new Pt( pa[0], y1 );\n\n    } else {\n      // diff slope, or b slope is vertical line\n      if (b == undefined) {\n        let y1 = -a.slope *  (pa[0] - pb[0]) + pa[1];\n        return new Pt( pb[0], y1 );\n\n      } else if (b.slope != a.slope) {\n        let px = (a.slope * pa[0] - b.slope * pb[0] + pb[1] - pa[1]) / (a.slope - b.slope);\n        let py = a.slope * ( px - pa[0] ) + pa[1];\n        return new Pt( px, py );\n        \n      } else {\n        if (a.yi == b.yi) { // exactly along the same path\n          return new Pt( pa[0], pa[1] );\n        } else {\n          return undefined;\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Given two line segemnts, find their intersection point if any.\n   * @param la a Group of 2 Pts representing a line segment\n   * @param lb a Group of 2 Pts representing a line segment\n   * @returns an intersection Pt or undefined if no intersection\n   */\n  static intersectLine2D( la:GroupLike, lb:GroupLike ):Pt {\n    let pt = Line.intersectRay2D( la, lb );\n    return ( pt && Geom.withinBound( pt, la[0], la[1] ) && Geom.withinBound(pt, lb[0], lb[1]) ) ? pt : undefined;\n  }\n\n\n  /**\n   * Given a line segemnt and a ray (infinite line), find their intersection point if any.\n   * @param line a Group of 2 Pts representing a line segment\n   * @param ray a Group of 2 Pts representing a ray\n   * @returns an intersection Pt or undefined if no intersection\n   */\n  static intersectLineWithRay2D( line:GroupLike, ray:GroupLike ):Pt {\n    let pt = Line.intersectRay2D( line, ray );\n    return ( pt && Geom.withinBound( pt, line[0], line[1] )) ? pt : undefined;\n  }\n\n\n  /**\n   * Given a line segemnt and a ray (infinite line), find its intersection point(s) with a polygon.\n   * @param lineOrRay a Group of 2 Pts representing a line or ray\n   * @param poly a Group of Pts representing a polygon\n   * @param sourceIsRay a boolean value to treat the line as a ray (infinite line). Default is `false`.\n   */\n  static intersectPolygon2D( lineOrRay:GroupLike, poly:GroupLike[], sourceIsRay:boolean=false ):Group {\n    let fn = sourceIsRay ? Line.intersectLineWithRay2D : Line.intersectLine2D; \n    let pts = new Group();\n    for (let i=0, len=poly.length; i<len; i++) {\n      let d = fn( poly[i], lineOrRay );\n      if (d) pts.push( d ); \n    }\n    return (pts.length > 0) ? pts : undefined;\n  } \n\n\n  /**\n   * Get two intersection Pts of a ray with a 2D grid point\n   * @param ray a ray specified by 2 Pts\n   * @param gridPt a Pt on the grid\n   * @returns a group of two intersecting Pts. The first one is horizontal intersection and the second one is vertical intersection.\n   */\n  static intersectGridWithRay2D( ray:GroupLike, gridPt:PtLike|number[] ):Group {\n    let t = Line.intercept( new Pt( ray[0] ).subtract( gridPt ), new Pt( ray[1] ).subtract( gridPt ) );\n    let g = new Group();\n    if (t && t.xi) g.push( new Pt( gridPt[0] + t.xi, gridPt[1] ) );\n    if (t && t.yi) g.push( new Pt( gridPt[0], gridPt[1] + t.yi ) );\n    return g;\n  }  \n\n\n  /**\n   * Get two intersection Pts of a line segment with a 2D grid point\n   * @param ray a ray specified by 2 Pts\n   * @param gridPt a Pt on the grid\n   * @returns a group of two intersecting Pts. The first one is horizontal intersection and the second one is vertical intersection.\n   */\n  static intersectGridWithLine2D( line:GroupLike, gridPt:PtLike|number[] ):Group {\n    let g = Line.intersectGridWithRay2D( line, gridPt );\n    let gg = new Group();\n    for (let i=0, len=g.length; i<len; i++) {\n      if ( Geom.withinBound( g[i], line[0], line[1] ) ) gg.push( g[i] );\n    }\n    return gg;\n  }\n\n\n  /**\n   * Quick way to check rectangle intersection. \n   * For more optimized implementation, store the rectangle's sides separately (eg, `Rectangle.sides()`) and use `Polygon.intersect2D()`.\n   * @param line a Group representing a line\n   * @param rect a Group representing a rectangle\n   */\n  static intersectRect2D( line:GroupLike, rect:GroupLike ):Group {\n    return Rectangle.intersectRect2D( Line.toRect(line), rect );\n  }\n\n\n  /**\n   * Get evenly distributed points on a line\n   * @param line a Group representing a line\n   * @param num number of points to get\n   */\n  static subpoints( line:GroupLike|number[][], num:number ) {\n    let pts = new Group();\n    for (let i=1; i<=num; i++) {\n      pts.push( Geom.interpolate( line[0], line[1], i/(num+1) ) );\n    }\n    return pts;\n  }\n\n\n  /**\n   * Crop this line by a circle or rectangle at end point.\n   * @param line line to crop\n   * @param size size of circle or rectangle as Pt\n   * @param index line's end point index, ie, 0 = start and 1 = end.\n   * @param cropAsCircle a boolean to specify whether the `size` parameter should be treated as circle. Default is `true`.\n   * @return an intersecting point on the line that can be used for cropping.\n   */\n  static crop( line:GroupLike, size:PtLike, index:number=0, cropAsCircle:boolean=true ):Pt {\n    let tdx = (index === 0) ? 1 : 0;\n    let ls = line[tdx].$subtract( line[index] );\n    if (ls[0] === 0 || size[0] === 0) return line[index];\n\n    if (cropAsCircle) {\n      let d = ls.unit().multiply( size[1] );\n      return line[index].$add( d );\n\n    } else {\n      let rect = Rectangle.fromCenter( line[index], size );\n      let sides = Rectangle.sides( rect );\n      let sideIdx = 0;\n\n      if ( Math.abs( ls[1]/ls[0] ) > Math.abs( size[1]/size[0] ) ) {\n        sideIdx = (ls[1] < 0) ? 0 : 2;\n      } else {\n        sideIdx = (ls[0] < 0) ? 3 : 1;\n      }\n      return Line.intersectRay2D( sides[sideIdx], line );\n\n    }\n  }\n\n  /**\n   * Create an marker arrow or line, placed at an end point of this line\n   * @param line line to place marker\n   * @param size size of the marker as Pt\n   * @param graphic either \"arrow\" or \"line\"\n   * @param atTail a boolean, if `true`, the marker will be positioned at tail of the line (ie, index = 1). Default is `true`.\n   * @returns a Group that defines the marker's shape\n   */\n  static marker( line:GroupLike, size:PtLike, graphic:string=(\"arrow\"||\"line\"), atTail:boolean=true ):Group {\n    let h = atTail ? 0 : 1;\n    let t = atTail ? 1 : 0;\n    let unit = line[h].$subtract( line[t] );\n    if (unit.magnitudeSq() === 0) return new Group();\n    unit.unit();\n    \n    let ps = Geom.perpendicular( unit ).multiply( size[0] ).add( line[t] );\n    if (graphic == \"arrow\") {\n      ps.add( unit.$multiply( size[1]) );\n      return new Group( line[t], ps[0], ps[1] );\n    } else {\n      return new Group( ps[0], ps[1] );\n    }\n\n  }\n\n  /**\n   * Convert this line to a rectangle representation\n   * @param line a Group representing a line\n   */\n  static toRect( line:GroupLike ) {\n    return new Group( line[0].$min( line[1] ), line[0].$max( line[1] ) );\n  }\n\n}\n\n\n\n/**\n * Rectangle class provides static functions to create and operate on rectangles. A rectangle is usually represented as a Group of 2 Pts, marking the top-left and bottom-right corners of the rectangle.\n * You can use the static function as-is, or apply the `op` method in Group or Pt to many of these functions.\n * See [Op guide](../../guide/Op-0400.html) for details.\n */\nexport class Rectangle {\n\n  /**\n   * Same as `Rectangle.fromTopLeft`\n   */\n  static from( topLeft:PtLike|number[], widthOrSize:number|PtLike, height?:number ):Group {\n    return Rectangle.fromTopLeft( topLeft, widthOrSize, height );\n  }\n\n\n  /**\n   * Create a rectangle given a top-left position and a size\n   * @param topLeft top-left point\n   * @param widthOrSize width as a number, or a Pt that defines its size\n   * @param height optional height as a number\n   */\n  static fromTopLeft( topLeft:PtLike|number[], widthOrSize:number|PtLike, height?:number ):Group {\n    let size = (typeof widthOrSize == \"number\") ? [widthOrSize, (height||widthOrSize) ] : widthOrSize;\n    return new Group(new Pt(topLeft), new Pt(topLeft).add( size ) );\n  }\n\n\n  /**\n   * Create a rectangle given a center position and a size\n   * @param topLeft top-left point\n   * @param widthOrSize width as a number, or a Pt that defines its size\n   * @param height optional height as a number\n   */\n  static fromCenter( center:PtLike|number[], widthOrSize:number|PtLike, height?:number ):Group {\n    let half = (typeof widthOrSize == \"number\") ? [ widthOrSize/2, (height||widthOrSize)/2 ] : new Pt(widthOrSize).divide(2);\n    return new Group(new Pt(center).subtract(half), new Pt(center).add(half));\n  }\n\n\n  /**\n   * Convert this rectangle to a circle that fits within the rectangle\n   * @returns a Group that represents a circle\n   * @see `Circle`\n   */\n  static toCircle( pts:GroupLike ):Group {\n    return Circle.fromRect( pts );\n  }\n\n  \n  /**\n   * Create a square that either fits within or encloses a rectangle\n   * @param pts a Group of 2 Pts representing a rectangle\n   * @param enclose if `true`, the square will enclose the rectangle. Default is `false`, which will fit the square inside the rectangle.\n   */\n  static toSquare( pts:GroupLike, enclose=false ):Group {\n    let s = Rectangle.size( pts );\n    let m = (enclose) ? s.maxValue().value : s.minValue().value;\n    return Rectangle.fromCenter( Rectangle.center(pts), m, m );\n  }\n\n\n  /**\n   * Get the size of this rectangle as a Pt\n   * @param pts a Group of 2 Pts representing a Rectangle\n   */\n  static size( pts:GroupLike ):Pt {\n    return pts[0].$max( pts[1] ).subtract( pts[0].$min( pts[1] ) );\n  }\n\n\n  /**\n   * Get the center of this rectangle \n   * @param pts a Group of 2 Pts representing a Rectangle\n   */\n  static center( pts:GroupLike ):Pt {\n    let min = pts[0].$min( pts[1] );\n    let max = pts[0].$max( pts[1] );\n    return min.add( max.$subtract( min ).divide( 2 ) );\n  }\n\n\n  /**\n   * Get the 4 corners of this rectangle as a Group\n   * @param rect a Group of 2 Pts representing a Rectangle\n   */\n  static corners( rect:GroupLike ):Group {\n    let p0 = rect[0].$min(rect[1]);\n    let p2 = rect[0].$max(rect[1]);\n    return new Group(p0,  new Pt(p2.x, p0.y), p2, new Pt(p0.x, p2.y));\n  }\n\n\n  /**\n   * Get the 4 sides of this rectangle as an array of 4 Groups\n   * @param rect a Group of 2 Pts representing a Rectangle\n   * @returns an array of 4 Groups, each of which represents a line segment\n   */\n  static sides( rect:GroupLike ):Group[] {\n    let [p0, p1, p2, p3] = Rectangle.corners( rect );\n    return [\n      new Group( p0, p1 ), new Group( p1, p2 ),\n      new Group( p2, p3 ), new Group( p3, p0 )\n    ];\n  }\n\n  \n  /**\n   * Same as `Rectangle.sides`\n   */\n  static lines( rect:GroupLike ): Group[] {\n    return Rectangle.sides( rect );\n  }\n \n\n  /**\n   * Given an array of rectangles, get a rectangle that bounds all of them\n   * @param rects an array of Groups that represent rectangles\n   * @returns the bounding rectangle as a Group\n   */\n  static boundingBox( rects:GroupLike[] ):Group {\n    let merged = Util.flatten( rects, false );\n    let min = Pt.make( 2, Number.MAX_VALUE );\n    let max = Pt.make( 2, Number.MIN_VALUE );\n\n    // calculate min max in a single pass\n    for (let i=0, len=merged.length; i<len; i++) {\n      for (let k=0; k<2; k++) {\n        min[k] = Math.min( min[k], merged[i][k] );\n        max[k] = Math.max( max[k], merged[i][k] );\n      }\n    }\n    return new Group( min, max );\n  }\n\n\n  /**\n   * Convert this rectangle into a Group representing a polygon\n   * @param rect a Group of 2 Pts representing a Rectangle\n   */\n  static polygon( rect:GroupLike ):Group {\n    return Rectangle.corners( rect );\n  }\n\n\n  /**\n   * Subdivide a rectangle into 4 rectangles, one for each quadrant\n   * @param rect a Group of 2 Pts representing a Rectangle\n   * @returns an array of 4 Groups of rectangles\n   */\n  static quadrants( rect:GroupLike, center?:PtLike ):Group[] {\n    let corners = Rectangle.corners( rect );\n    let _center = (center!=undefined) ? new Pt(center) : Rectangle.center( rect );\n    return corners.map( (c) => new Group(c, _center).boundingBox() );\n  }\n\n\n  /**\n   * Subdivde a rectangle into 2 rectangles, by row or by column\n   * @param rect Group of 2 Pts representing a Rectangle\n   * @param ratio a value between 0 to 1 to indicate the split ratio\n   * @param asRows if `true`, split into 2 rows. Default is `false` which splits into 2 columns.\n   * @returns an array of 2 Groups of rectangles\n   */\n  static halves( rect:GroupLike, ratio:number=0.5, asRows:boolean=false ):Group[] {\n    let min = rect[0].$min( rect[1] );\n    let max = rect[0].$max( rect[1] );\n    let mid = (asRows) ? Num.lerp( min[1], max[1], ratio ) : Num.lerp( min[0], max[0], ratio );\n    return (asRows) \n            ? [new Group( min, new Pt(max[0],mid) ), new Group( new Pt(min[0],mid), max )]\n            : [new Group( min, new Pt(mid,max[1]) ), new Group( new Pt(mid,min[1]), max )];\n  }\n\n\n  /**\n   * Check if a point is within a rectangle\n   * @param rect a Group of 2 Pts representing a Rectangle\n   * @param pt the point to check\n   */\n  static withinBound( rect:GroupLike, pt:PtLike ):boolean {\n    return Geom.withinBound( pt, rect[0], rect[1] );\n  }\n\n\n  /**\n   * Check if a rectangle is within the bounds of another rectangle\n   * @param rect1 a Group of 2 Pts representing a rectangle\n   * @param rect2 a Group of 2 Pts representing a rectangle\n   */\n  static hasIntersectRect2D( rect1:GroupLike, rect2:GroupLike ):boolean {\n    let pts = Rectangle.corners( rect1 );\n    for (let i=0, len=pts.length; i<len; i++) {\n      if (Geom.withinBound( pts[i], rect2[0], rect2[1])) return true;\n    }\n    return false;\n  }\n\n\n  /**\n   * Quick way to check rectangle intersection. \n   * For more optimized implementation, store the rectangle's sides separately (eg, `Rectangle.sides()`) and use `Polygon.intersect2D()`.\n   * @param rect1 a Group of 2 Pts representing a rectangle\n   * @param rect2 a Group of 2 Pts representing a rectangle\n   */\n  static intersectRect2D( rect1:GroupLike, rect2:GroupLike ):Group {\n    return Util.flatten(\n      Polygon.intersect2D( Rectangle.sides( rect1 ), Rectangle.sides( rect2 ) )\n    );\n  }\n\n}\n\n\n\n/**\n * Circle class provides static functions to create and operate on circles. A circle is usually represented as a Group of 2 Pts, where the first Pt specifies the center, and the second Pt specifies the radius.\n * You can use the static function as-is, or apply the `op` method in Group or Pt to many of these functions.\n * See [Op guide](../../guide/Op-0400.html) for details.\n */\nexport class Circle {\n  \n\n  /**\n   * Create a circle that either fits within or encloses a rectangle\n   * @param pts a Group of 2 Pts representing a rectangle\n   * @param enclose if `true`, the circle will enclose the rectangle. Default is `false`, which will fit the circle inside the rectangle.\n   */\n  static fromRect( pts:GroupLike, enclose=false ):Group {\n    let r = 0;\n    let min = r = Rectangle.size( pts ).minValue().value / 2;\n    if (enclose) {\n      let max = Rectangle.size( pts ).maxValue().value / 2;\n      r = Math.sqrt( min*min + max*max );\n    } else {\n      r = min;\n    }\n    return new Group( Rectangle.center( pts ), new Pt(r, r) );\n  }\n\n\n  /**\n   * Create a circle based on a center point and a radius\n   * @param pt center point of circle\n   * @param radius radius of circle\n   */\n  static fromCenter( pt:PtLike, radius:number ):Group {\n    return new Group( new Pt(pt), new Pt(radius, radius) );\n  }\n\n\n  /**\n   * Check if a point is within a circle\n   * @param pts a Group of 2 Pts representing a circle\n   * @param pt the point to checks\n   * @param threshold an optional small number to set threshold. Default is 0.\n   */\n  static withinBound( pts:GroupLike, pt:PtLike, threshold:number=0 ):boolean  {\n    let d = pts[0].$subtract( pt );\n    return d.dot(d) + threshold < pts[1].x * pts[1].x;\n  }\n\n\n  /**\n   * Get the intersection points between a circle and a ray (infinite line)\n   * @param pts a Group of 2 Pts representing a circle\n   * @param ray a Group of 2 Pts representing a ray \n   * @returns a Group of intersection points, or an empty Group if no intersection is found\n   */\n  static intersectRay2D( pts:GroupLike, ray:GroupLike ):Group {\n    let d = ray[0].$subtract( ray[1] );\n    let f = pts[0].$subtract( ray[0] );\n\n    let a = d.dot( d );\n    let b = f.dot( d );\n    let c = f.dot( f ) - pts[1].x * pts[1].x;\n    let p = b/a;\n    let q = c/a;\n    let disc = p * p - q; // discriminant\n\n    if (disc < 0) {\n      return new Group();\n    } else {\n      let discSqrt = Math.sqrt( disc );\n\n      let t1 = -p + discSqrt;\n      let p1 = ray[0].$subtract( d.$multiply( t1 ) );\n      if (disc === 0) return new Group( p1 );\n\n      let t2 = -p - discSqrt;\n      let p2 = ray[0].$subtract( d.$multiply( t2 ) );\n      return new Group( p1, p2 );\n    }\n  }\n\n\n  /**\n   * Get the intersection points between a circle and a line segment\n   * @param pts a Group of 2 Pts representing a circle\n   * @param ray a Group of 2 Pts representing a line\n   * @returns a Group of intersection points, or an empty Group if no intersection is found\n   */\n  static intersectLine2D( pts:GroupLike, line:GroupLike ):Group {\n    let ps = Circle.intersectRay2D( pts, line );\n    let g = new Group();\n    if (ps.length > 0) {\n      for (let i=0, len=ps.length; i<len; i++) {\n        if (Rectangle.withinBound( line, ps[i] )) g.push( ps[i] );\n      }\n    }\n    return g;\n  }\n\n\n  /**\n   * Get the intersection points between two circles\n   * @param pts a Group of 2 Pts representing a circle\n   * @param circle a Group of 2 Pts representing a circle\n   * @returns a Group of intersection points, or an empty Group if no intersection is found\n   */\n  static intersectCircle2D( pts:GroupLike, circle:GroupLike ):Group {\n    let dv = circle[0].$subtract( pts[0] );\n    let dr2 = dv.magnitudeSq();\n    let dr = Math.sqrt( dr2 );\n\n    let ar = pts[1].x;\n    let br = circle[1].x;\n    let ar2 = ar * ar;\n    let br2 = br * br;\n\n\n    if ( dr > ar + br ) { // not intersected\n      return new Group();\n    } else if ( dr < Math.abs( ar - br ) ) { // completely enclosed\n      return new Group( pts[0].clone() );\n    } else {\n      let a = (ar2 - br2 + dr2) / (2 * dr);\n      let h = Math.sqrt( ar2 - a*a );\n      let p = dv.$multiply( a/dr ).add( pts[0] );\n      return new Group(  \n        new Pt( p.x + h*dv.y/dr, p.y - h*dv.x/dr ),\n        new Pt( p.x - h*dv.y/dr, p.y + h*dv.x/dr )\n      );\n    }\n  }\n\n\n  /**\n   * Quick way to check rectangle intersection with a circle. \n   * For more optimized implementation, store the rectangle's sides separately (eg, `Rectangle.sides()`) and use `Polygon.intersect2D()`.\n   * @param pts a Group of 2 Pts representing a circle\n   * @param rect a Group of 2 Pts representing a rectangle\n   * @returns a Group of intersection points, or an empty Group if no intersection is found\n   */\n  static intersectRect2D( pts:GroupLike, rect:GroupLike ):Group {\n    let sides = Rectangle.sides( rect );\n    let g = [];\n    for (let i=0, len=sides.length; i<len; i++) {\n      let ps = Circle.intersectLine2D( pts, sides[i] );\n      if (ps.length > 0) g.push( ps );\n    }\n    return Util.flatten( g );\n  }\n\n\n  /**\n   * Convert this cirlce to a rectangle that encloses this circle\n   * @param pts a Group of 2 Pts representing a circle\n   */\n  static toRect( pts:GroupLike ):Group {\n    let r = pts[1][0];\n    return new Group( pts[0].$subtract( r ), pts[0].$add( r ) );\n  }\n\n\n  /**\n   * Convert this cirlce to a rectangle that fits within this circle\n   * @param pts a Group of 2 Pts representing a circle\n   */\n  static toInnerRect( pts:GroupLike ):Group {\n    let r = pts[1][0];\n    let half = Math.sqrt(r*r)/2;\n    return new Group( pts[0].$subtract(half), pts[0].$add( half ) );\n  }\n\n\n  /**\n   * Convert this cirlce to a triangle that fits within this circle\n   * @param pts a Group of 2 Pts representing a circle\n   */\n  static toInnerTriangle( pts:GroupLike ):Group {\n    let ang = -Math.PI/2;\n    let inc = Math.PI * 2/3;\n    let g = new Group();\n    for (let i=0; i<3; i++) {\n      g.push( pts[0].clone().toAngle( ang, pts[1][0], true ) );\n      ang += inc;\n    }\n    return g;\n  }\n\n}\n\n\n\n/**\n * Triangle class provides static functions to create and operate on trianges. A triange is usually represented as a Group of 3 Pts.\n * You can use the static function as-is, or apply the `op` method in Group or Pt to many of these functions.\n * See [Op guide](../../guide/Op-0400.html) for details.\n */\nexport class Triangle {\n \n  /**\n   * Create a triangle from a rectangle. The triangle will be isosceles, with the bottom of the rectangle as its base.\n   * @param rect a Group of 2 Pts representing a rectangle\n   */\n  static fromRect( rect:GroupLike ):Group {\n    let top = rect[0].$add( rect[1] ).divide(2);\n    top.y = rect[0][1];\n    let left = rect[1].clone();\n    left.x = rect[0][0];\n    return new Group( top, rect[1].clone(), left );\n  }\n\n\n  /**\n   * Create a triangle that fits within a circle\n   * @param circle a Group of 2 Pts representing a circle\n   */\n  static fromCircle( circle:GroupLike ):Group {\n    return Circle.toInnerTriangle( circle );\n  }\n\n\n  /**\n   * Create an equilateral triangle based on a center point and a size\n   * @param pt the center point\n   * @param size size is the magnitude of lines from center to the triangle's vertices, like a \"radius\".\n   */\n  static fromCenter( pt:PtLike, size:number ):Group {\n    return Triangle.fromCircle( Circle.fromCenter( pt, size ) );\n  }\n\n\n  /**\n   * Get the medial, which is an inner triangle formed by connecting the midpoints of this triangle's sides\n   * @param pts a Group of Pts\n   * @returns a Group representing a medial triangle\n   */\n  static medial( pts:GroupLike ):Group {\n    if (pts.length < 3) return _errorLength( new Group(), 3 );\n    return Polygon.midpoints( pts, true );\n  }\n\n\n  /**\n   * Given a point of the triangle, the opposite side is the side which the point doesn't touch.\n   * @param pts a Group of Pts\n   * @param index a Pt on the triangle group\n   * @returns a Group that represents a line of the opposite side\n   */\n  static oppositeSide( pts:GroupLike, index:number ):Group {\n    if (pts.length < 3) return _errorLength( new Group(), 3 );\n    if (index === 0) {\n      return Group.fromPtArray( [pts[1], pts[2]] );\n    } else if (index === 1) {\n      return Group.fromPtArray( [pts[0], pts[2]] );\n    } else {\n      return Group.fromPtArray( [pts[0], pts[1]] );\n    }\n  }\n\n  /**\n   * Get a triangle's altitude, which is a line from a triangle's point to its opposite side, and perpendicular to its opposite side.\n   * @param pts a Group of Pts\n   * @param index a Pt on the triangle group\n   * @returns a Group that represents the altitude line\n   */\n  static altitude( pts:GroupLike, index:number ):Group {\n    let opp = Triangle.oppositeSide( pts, index );\n    if (opp.length > 1) {\n      return new Group( pts[index], Line.perpendicularFromPt( opp, pts[index] ) ); \n    } else {\n      return new Group();\n    }\n  }\n\n  /**\n   * Get orthocenter, which is the intersection point of a triangle's 3 altitudes (the 3 lines that are perpendicular to its 3 opposite sides).\n   * @param pts a Group of Pts\n   * @returns the orthocenter as a Pt\n   */\n  static orthocenter( pts:GroupLike ):Pt {\n    if (pts.length < 3) return _errorLength( undefined, 3 );\n    let a = Triangle.altitude( pts, 0 );\n    let b = Triangle.altitude( pts, 1 );\n    return Line.intersectRay2D( a, b );\n  }\n\n  /**\n   * Get incenter, which is the center point of its inner circle, and also the intersection point of its 3 angle bisector lines (each of which cuts one of the 3 angles in half).\n   * @param pts a Group of Pts\n   * @returns the incenter as a Pt\n   */\n  static incenter( pts:GroupLike ):Pt {\n    if (pts.length < 3) return _errorLength( undefined, 3 );\n    let a = Polygon.bisector( pts, 0 ).add( pts[0] );\n    let b = Polygon.bisector( pts, 1 ).add( pts[1] );\n    return Line.intersectRay2D( new Group(pts[0], a), new Group(pts[1], b) );\n  }\n\n  /**\n   * Get an interior circle, which is the largest circle completed enclosed by this triangle\n   * @param pts a Group of Pts\n   * @param center Optional parameter if the incenter is already known. Otherwise, leave it empty and the incenter will be calculated\n   */\n  static incircle( pts:GroupLike, center?:Pt ):Group {\n    let c = (center) ? center : Triangle.incenter( pts );\n    let area = Polygon.area( pts );\n    let perim = Polygon.perimeter( pts, true );\n    let r = 2 * area / perim.total;\n    return Circle.fromCenter( c, r );\n  }\n\n  /**\n   * Get circumcenter, which is the intersection point of its 3 perpendicular bisectors lines ( each of which divides a side in half and is perpendicular to the side)\n   * @param pts a Group of Pts\n   * @returns the circumcenter as a Pt\n   */\n  static circumcenter( pts:GroupLike ):Pt {\n    let md = Triangle.medial( pts );\n    let a = [ md[0], Geom.perpendicular( pts[0].$subtract( md[0] )).p1.$add( md[0] ) ];\n    let b = [ md[1], Geom.perpendicular( pts[1].$subtract( md[1] )).p1.$add( md[1] ) ];\n    return Line.intersectRay2D( a, b );\n  } \n\n  /**\n   * Get circumcenter, which is the intersection point of its 3 perpendicular bisectors lines ( each of which divides a side in half and is perpendicular to the side)\n   * @param pts a Group of Pts\n   * @param center Optional parameter if the circumcenter is already known. Otherwise, leave it empty and the circumcenter will be calculated \n   */\n  static circumcircle( pts:GroupLike, center?:Pt ):Group {\n    let c = (center) ? center : Triangle.circumcenter( pts );\n    let r = pts[0].$subtract( c ).magnitude();\n    return Circle.fromCenter( c, r );\n  }\n}\n\n\n\n/**\n * Polygon class provides static functions to create and operate on polygons. A polygon is usually represented as a Group of 3 or more Pts.\n * You can use the static function as-is, or apply the `op` method in Group or Pt to many of these functions.\n * See [Op guide](../../guide/Op-0400.html) for details.\n */\nexport class Polygon {\n\n  /**\n   * Get the centroid of a polygon, which is the average of all its points.\n   * @param pts a Group of Pts representing a polygon\n   */\n  static centroid( pts:GroupLike ):Pt {\n    return Geom.centroid( pts );\n  }\n\n  /**\n   * Get the line segments in this polygon\n   * @param pts a Group of Pts\n   * @param closePath a boolean to specify whether the polygon should be closed (ie, whether the final segment should be counted).\n   * @returns an array of Groups which has 2 Pts in each group\n   */\n  static lines( pts:GroupLike, closePath:boolean=false ):Group[] {\n    if (pts.length < 2) return _errorLength( new Group(), 2 );\n    let sp = Util.split( pts, 2, 1 );\n    if (closePath) sp.push( new Group( pts[pts.length-1], pts[0]) );\n    return sp.map( (g) => g as Group );\n  }\n\n  /**\n   * Get a new polygon group that is derived from midpoints in this polygon\n   * @param pts a Group of Pts\n   * @param closePath a boolean to specify whether the polygon should be closed (ie, whether the final segment should be counted).\n   * @param t a value between 0 to 1 for interpolation. Default to 0.5 which will get the middle point.\n   */\n  static midpoints( pts:GroupLike, closePath:boolean=false, t:number=0.5 ):Group {\n    if (pts.length < 2) return _errorLength( new Group(), 2 );\n    let sides = Polygon.lines( pts, closePath );\n    let mids = sides.map( (s) => Geom.interpolate( s[0], s[1], t) );\n    return mids as Group;\n  }\n\n  /**\n   * Given a Pt in the polygon group, the adjacent sides are the two sides which the Pt touches.\n   * @param pts a group of Pts\n   * @param index the target Pt\n   * @param closePath a boolean to specify whether the polygon should be closed (ie, whether the final segment should be counted).\n   */\n  static adjacentSides( pts:GroupLike, index:number, closePath:boolean=false ):Group[] {\n    if (pts.length < 2) return _errorLength( new Group(), 2 );\n    if (index < 0 || index >= pts.length) return _errorOutofBound( new Group(), index );\n\n    let gs = [];\n    let left = index-1;\n    if (closePath && left < 0) left = pts.length-1;\n    if (left >= 0) gs.push( new Group( pts[index], pts[left]) );\n\n    let right = index+1;\n    if (closePath && right > pts.length-1) right = 0;\n    if (right <= pts.length-1) gs.push( new Group( pts[index], pts[right]) );\n\n    return gs;\n  }\n\n\n  /**\n   * Get a bisector which is a line that split between two sides of a polygon equally. \n   * @param pts a group of Pts\n   * @param index the Pt in the polygon to bisect from\n   * @param closePath a boolean to specify whether the polygon should be closed (ie, whether the final segment should be counted).\n   * @returns a bisector Pt that's a normalized unit vector\n   */\n  static bisector( pts:GroupLike, index:number ):Pt {\n    \n    let sides = Polygon.adjacentSides( pts, index, true );\n    if (sides.length >= 2) {\n      let a = sides[0][1].$subtract( sides[0][0] ).unit();\n      let b = sides[1][1].$subtract( sides[1][0] ).unit();\n      return a.add( b ).divide( 2 ); \n    } else {\n      return undefined;\n    }\n\n  }\n  \n\n  /**\n   * Find the perimeter of this polygon, ie, the lengths of its sides.\n   * @param pts a group of Pts\n   * @param closePath a boolean to specify whether the polygon should be closed (ie, whether the final segment should be counted).\n   * @returns an object with `total` length, and `segments` which is a Pt that stores each segment's length\n   */\n  static perimeter( pts:GroupLike, closePath:boolean=false ):{total:number, segments:Pt} {\n    if (pts.length < 2) return _errorLength( new Group(), 2 );\n    let lines = Polygon.lines( pts, closePath );\n    let mag = 0;\n    let p = Pt.make( lines.length, 0 );\n\n    for (let i=0, len=lines.length; i<len; i++) {\n      let m = Line.magnitude( lines[i] );\n      mag += m;\n      p[i] = m;\n    }\n\n    return {\n      total: mag,\n      segments: p\n    };\n  }\n\n  \n  /**\n   * Find the area of a *convex* polygon.\n   * @param pts a group of Pts\n   */\n  static area( pts:GroupLike ) {\n    if (pts.length < 3) return _errorLength( new Group(), 3 );\n    // determinant\n    let det = (a, b) => a[0] * b[1] - a[1] * b[0];\n\n    let area = 0;\n    for (let i=0, len=pts.length; i<len; i++) {\n      if (i < pts.length-1) {\n        area += det( pts[i], pts[i+1]);\n      } else {  \n        area += det( pts[i], pts[0] );\n      }\n    }\n    return Math.abs( area/2 );\n  }\n\n  /**\n   * Get a convex hull of the point set using Melkman's algorithm\n   * (Reference: http://geomalgorithms.com/a12-_hull-3.html)\n   * @param pts a group of Pt\n   * @param sorted a boolean value to indicate if the group is pre-sorted by x position. Default is false.\n   * @returns a group of Pt that defines the convex hull polygon\n   */\n  static convexHull( pts:GroupLike, sorted:boolean=false ): Group {\n    if (pts.length < 3) return _errorLength( new Group(), 3 );\n\n    if (!sorted) {\n      pts = pts.slice();\n      pts.sort( (a,b) => a[0]-b[0] );\n    } \n\n    // check if is on left of ray a-b\n    let left = (a, b, c) => {\n      return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]) > 0;\n    };\n    \n    // double end queue\n    let dq = [];\n    let bot = pts.length - 2;\n    let top = bot + 3;\n    dq[bot] = pts[2];\n    dq[top] = pts[2];\n\n    // first 3 pt as counter-clockwise triangle\n    if ( left( pts[0], pts[1], pts[2]) ) {\n      dq[bot+1] = pts[0];\n      dq[bot+2] = pts[1];\n    } else {\n      dq[bot+1] = pts[1];\n      dq[bot+2] = pts[0];\n    }\n\n    // remaining pts\n    for (let i=3, len=pts.length; i<len; i++) {\n      let pt = pts[i];\n      \n      // if inside the hull\n      if ( left( dq[bot], dq[bot+1], pt ) && left(dq[top-1], dq[top], pt)) {\n        continue;\n      }\n\n      // rightmost tangent\n      while ( !left(dq[bot], dq[bot+1], pt)) { bot += 1; }\n      bot -= 1;\n      dq[bot] = pt;\n      \n      // leftmost tangent\n      while ( !left( dq[top-1], dq[top], pt)) { top -= 1; }\n      top += 1;\n      dq[top] = pt;\n    }\n\n    let hull = new Group();\n    for (let h=0; h<(top-bot); h++) {\n      hull.push( dq[bot+h] );\n    }\n\n    return hull;\n\n  }\n\n\n  /**\n   * Find intersection points of 2 polygons\n   * @param poly a Group representing a polygon\n   * @param linesOrRays an array of Groups representing lines\n   * @param sourceIsRay a boolean value to treat the line as a ray (infinite line). Default is `false`.\n   */\n  static intersect2D( poly:GroupLike[], linesOrRays:GroupLike[], sourceIsRay:boolean=false):Group[] {\n    let groups = [];\n    for (let i=0, len=linesOrRays.length; i<len; i++) {\n      let _ip = Line.intersectPolygon2D( linesOrRays[i], poly, sourceIsRay );\n      if (_ip) groups.push( _ip );\n    }\n    return groups;\n  }\n\n\n  /**\n   * Given a point in the polygon as an origin, get an array of lines that connect all the remaining points to the origin point.\n   * @param pts a Group representing a polygon\n   * @param originIndex the origin point's index in the polygon\n   */\n  static network( pts:GroupLike, originIndex:number=0 ):Group[] {\n    let g = [];\n    for (let i=0, len=pts.length; i<len; i++) {\n      if (i != originIndex) g.push( new Group( pts[originIndex], pts[i] ) );\n    }\n    return g;\n  }\n\n\n  /**\n   * Given a target Pt, find a Pt in a Group that's nearest to it.\n   * @param pts a Group of Pt\n   * @param pt Pt to check\n   * @returns an index in the pts indicating the nearest Pt, or -1 if none found\n   */\n  static nearestPt( pts:GroupLike, pt:PtLike ):number {\n    let _near = Number.MAX_VALUE;\n    let _item = -1;\n    for (let i=0, len=pts.length; i<len; i++) {\n      let d = pts[i].$subtract( pt ).magnitudeSq();\n      if (d < _near) {\n        _near = d;\n        _item = i;\n      }\n    }\n    return _item;\n  }\n\n\n  /**\n   * Get a bounding box for each polygon group, as well as a union bounding-box for all groups\n   * @param polys an array of Groups, or an array of Pt arrays\n   */\n  static toRects( poly:GroupLike[] ):GroupLike[] {\n    let boxes = poly.map( (g) => Geom.boundingBox(g) );\n    let merged = Util.flatten( boxes, false );\n    boxes.unshift( Geom.boundingBox( merged ) );\n    return boxes;\n  }\n\n}\n\n\n\n/**\n * Curve class provides static functions to interpolate curves. A curve is usually represented as a Group of 3 control points.\n * You can use the static function as-is, or apply the `op` method in Group or Pt to many of these functions.\n * See [Op guide](../../guide/Op-0400.html) for details.\n */\nexport class Curve {\n\n  /**\n   * Get a precalculated coefficients per step\n   * @param steps number of steps\n   */\n  static getSteps( steps:number ):Group {\n    let ts = new Group();\n    for (let i=0; i<=steps; i++) {\n      let t = i/steps;\n      ts.push( new Pt(t*t*t, t*t, t, 1) );\n    }\n    return ts;\n  }\n\n  /**\n   * Given an index for the starting position in a Pt group, get the control and/or end points of a curve segment\n   * @param pts a group of Pt\n   * @param index start index in `pts` array. Default is 0.\n   * @param copyStart an optional boolean value to indicate if the start index should be used twice. Default is false.\n   * @returns a group of 4 Pts\n   */\n  static controlPoints( pts:GroupLike, index:number=0, copyStart:boolean=false):Group {\n    if (index > pts.length-1) return new Group();\n    let _index = (i) => (i < pts.length-1) ? i : pts.length-1;\n\n    let p0 = pts[index];\n    index = (copyStart) ? index : index+1;\n\n    // get points based on index\n    return new Group(\n      p0, pts[ _index(index++) ],\n      pts[ _index(index++) ], pts[ _index(index++) ]\n    );\n  }\n\n  /**\n   * Calulcate weighted sum to get the interpolated points\n   * @param ctrls anchors\n   * @param params parameters\n   */\n  static _calcPt( ctrls:GroupLike, params:PtLike ):Pt {\n    let x = ctrls.reduce( (a, c, i) => a + c.x*params[i], 0 );\n    let y = ctrls.reduce( (a, c, i) => a + c.y*params[i], 0 );\n    if (ctrls[0].length > 2) {\n      let z = ctrls.reduce( (a, c, i) => a + c.z*params[i], 0 );\n      return new Pt( x, y, z );\n    }\n    return new Pt( x, y );\n  }\n\n  /**\n   * Create a Catmull-Rom curve. Catmull-Rom is a kind of Cardinal curve with smooth-looking curve.\n   * @param pts a group of anchor Pt\n   * @param steps the number of line segments per curve. Defaults to 10 steps.\n   * @returns a curve as a group of interpolated Pt\n   */\n  static catmullRom( pts:GroupLike, steps:number=10 ):Group {\n    if (pts.length < 2) return new Group();\n\n    let ps = new Group();\n    let ts = Curve.getSteps( steps );\n\n    // use first point twice\n    let c = Curve.controlPoints( pts, 0, true );\n    for (let i=0; i<=steps; i++) {\n      ps.push( Curve.catmullRomStep( ts[i], c ) );\n    }\n\n    let k = 0;\n    while ( k < pts.length-2 ) {\n      let cp = Curve.controlPoints( pts, k );\n      if (cp.length > 0) {\n        for (let i=0; i<=steps; i++) {\n          ps.push( Curve.catmullRomStep( ts[i], cp ) );\n        }\n        k++;\n      }\n    }\n\n    return ps;\n  }\n\n\n  /**\n   * Interpolate to get a point on Catmull-Rom curve\n   * @param step the coefficients [t*t*t, t*t, t, 1]\n   * @param ctrls a group of anchor Pts\n   * @return an interpolated Pt on the curve\n   */\n  static catmullRomStep( step:Pt, ctrls:GroupLike ):Pt {\n    /*\n    * Basis Matrix (http://mrl.nyu.edu/~perlin/courses/fall2002/hw/12.html)\n    * [-0.5,  1.5, -1.5, 0.5],\n    * [ 1  , -2.5,  2  ,-0.5],\n    * [-0.5,  0  ,  0.5, 0  ],\n    * [ 0  ,  1  ,  0  , 0  ]\n    */\n\n    let m = new Group(\n      new Pt(-0.5, 1, -0.5, 0),\n      new Pt(1.5, -2.5, 0, 1),\n      new Pt(-1.5, 2, 0.5, 0),\n      new Pt( 0.5, -0.5, 0, 0 )\n    );\n\n    return Curve._calcPt( ctrls, Mat.multiply( [step], m, true )[0] );\n  }\n\n  /**\n   * Create a Cardinal spline curve\n   * @param pts a group of anchor Pt\n   * @param steps the number of line segments per curve. Defaults to 10 steps.\n   * @param tension optional value between 0 to 1 to specify a \"tension\". Default to 0.5 which is the tension for Catmull-Rom curve.\n   * @returns a curve as a group of interpolated Pt\n   */\n  static cardinal( pts:GroupLike, steps:number=10, tension=0.5 ):Group {\n    if (pts.length < 2) return new Group();\n\n    let ps = new Group();\n    let ts = Curve.getSteps( steps );\n\n    // use first point twice\n    let c = Curve.controlPoints( pts, 0, true );\n    for (let i=0; i<=steps; i++) {\n      ps.push( Curve.cardinalStep( ts[i], c, tension ) );\n    }\n\n    let k = 0;\n    while ( k < pts.length-2 ) {\n      let cp = Curve.controlPoints( pts, k );\n      if (cp.length > 0) {\n        for (let i=0; i<=steps; i++) {\n          ps.push( Curve.cardinalStep( ts[i], cp, tension ) );\n        }\n        k++;\n      }\n    }\n\n    return ps;\n  }\n\n  /**\n   * Interpolate to get a point on Catmull-Rom curve\n   * @param step the coefficients [t*t*t, t*t, t, 1]\n   * @param ctrls a group of anchor Pts\n   * @param tension optional value between 0 to 1 to specify a \"tension\". Default to 0.5 which is the tension for Catmull-Rom curve\n   * @return an interpolated Pt on the curve\n   */\n  static cardinalStep( step:Pt, ctrls:GroupLike, tension:number=0.5 ):Pt {\n    /*\n    * Basis Matrix (http://algorithmist.wordpress.com/2009/10/06/cardinal-splines-part-4/)\n    * [ -s  2-s  s-2   s ]\n    * [ 2s  s-3  3-2s -s ]\n    * [ -s   0    s    0 ]\n    * [  0   1    0    0 ]\n    */\n\n    let m = new Group(\n      new Pt( -1,  2, -1, 0),\n      new Pt( -1,  1,  0, 0),\n      new Pt(  1, -2,  1, 0),\n      new Pt(  1, -1,  0, 0)\n    );\n\n    let h = Mat.multiply( [step], m, true )[0].multiply( tension );\n    let h2 = (2*step[0] - 3*step[1] + 1);\n    let h3 = -2*step[0] + 3*step[1];\n\n    let pt = Curve._calcPt( ctrls, h );\n\n    pt.x += h2*ctrls[1].x + h3*ctrls[2].x;\n    pt.y += h2*ctrls[1].y + h3*ctrls[2].y;\n    if (pt.length > 2) pt.z += h2*ctrls[1].z + h3*ctrls[2].z;\n\n    return pt;\n  }\n\n\n  /**\n   * Create a Bezier curve. In a cubic bezier curve, the first and 4th anchors are end-points, and 2nd and 3rd anchors are control-points.\n   * @param pts a group of anchor Pt\n   * @param steps the number of line segments per curve. Defaults to 10 steps.\n   * @returns a curve as a group of interpolated Pt\n   */\n  static bezier( pts:GroupLike, steps:number=10 ) {\n\n    if (pts.length < 4) return new Group();\n\n    let ps = new Group();\n    let ts = Curve.getSteps( steps );\n\n    let k = 0;\n    while ( k < pts.length-3 ) {\n      let c = Curve.controlPoints( pts, k );\n      if (c.length > 0) {\n        for (let i=0; i<=steps; i++) {\n          ps.push( Curve.bezierStep( ts[i], c ) );\n        }\n\n        // go to the next set of point, but assume current end pt is next start pt\n        k+=3;\n      }\n    }\n\n    return ps;\n  }\n\n  /**\n   * Interpolate to get a point on a cubic Bezier curve\n   * @param step the coefficients [t*t*t, t*t, t, 1]\n   * @param ctrls a group of anchor Pts\n   * @return an interpolated Pt on the curve\n   */\n  static bezierStep( step:Pt, ctrls:GroupLike ) {\n    /*\n    * Bezier basis matrix\n    * [ -1,  3, -3,  1 ]\n    * [  3, -6,  3,  0 ]\n    * [ -3,  3,  0,  0 ]\n    * [  1,  0,  0,  0 ]\n    */\n\n    let m = new Group(\n      new Pt( -1,  3, -3, 1),\n      new Pt(  3, -6,  3, 0),\n      new Pt( -3,  3,  0, 0),\n      new Pt(  1,  0,  0, 0)\n    );\n\n    return Curve._calcPt( ctrls, Mat.multiply( [step], m, true )[0] );\n  }\n\n  /**\n   * Create a B-spline curve\n   * @param pts a group of anchor Pt\n   * @param steps the number of line segments per curve. Defaults to 10 steps.\n   * @param tension optional value between 0 to n to specify a \"tension\". Default is 1 which is the usual tension.\n   * @returns a curve as a group of interpolated Pt\n   */\n  static bspline( pts:GroupLike, steps:number=10, tension:number=1 ):Group {\n    if (pts.length < 2) return new Group();\n\n    let ps = new Group();\n    let ts = Curve.getSteps( steps );\n\n\n    let k = 0;\n    while ( k < pts.length-3 ) {\n      let c = Curve.controlPoints( pts, k );\n      if (c.length > 0) {\n        if (tension !== 1) {\n          for (let i=0; i<=steps; i++) {\n            ps.push( Curve.bsplineTensionStep( ts[i], c, tension ) );\n          }\n        } else {\n          for (let i=0; i<=steps; i++) {\n            ps.push( Curve.bsplineStep( ts[i], c ) );\n          }\n        }\n        k++;\n      }\n    }\n\n    return ps;\n  }\n\n  /**\n   * Interpolate to get a point on a B-spline curve\n   * @param step the coefficients [t*t*t, t*t, t, 1]\n   * @param ctrls a group of anchor Pts\n   * @return an interpolated Pt on the curve\n   */  \n  static bsplineStep( step:Pt, ctrls:GroupLike ):Pt {\n    /*\n    * Basis matrix:\n    * [ -1.0/6.0,  3.0/6.0, -3.0/6.0, 1.0/6.0 ],\n    * [  3.0/6.0, -6.0/6.0,  3.0/6.0,    0.0 ],\n    * [ -3.0/6.0,      0.0,  3.0/6.0,    0.0 ],\n    * [  1.0/6.0,  4.0/6.0,  1.0/6.0,    0.0 ]\n    */\n\n    let m = new Group(\n      new Pt( -0.16666666666666666,  0.5, -0.5, 0.16666666666666666),\n      new Pt(  0.5, -1,  0, 0.6666666666666666),\n      new Pt( -0.5,  0.5,  0.5, 0.16666666666666666),\n      new Pt(  0.16666666666666666,  0,  0, 0)\n    );\n\n    return Curve._calcPt( ctrls, Mat.multiply( [step], m, true )[0] );\n  }\n\n  /**\n   * Interpolate to get a point on a B-spline curve\n   * @param step the coefficients [t*t*t, t*t, t, 1]\n   * @param ctrls a group of anchor Pts\n   * @param tension optional value between 0 to n to specify a \"tension\". Default to 1 which is the usual tension.\n   * @return an interpolated Pt on the curve\n   */  \n  static bsplineTensionStep( step:Pt, ctrls:GroupLike, tension:number=1 ):Pt {\n    /*\n    * Basis matrix:\n    * [ -1/6a, 2 - 1.5a, 1.5a - 2, 1/6a ]\n    * [ 0.5a,  2a-3,     3-2.5a    0 ]\n    * [ -0.5a, 0,        0.5a,     0 ]\n    * [ 1/6a,  1 - 1/3a, 1/6a,     0 ]\n    */\n\n    let m = new Group(\n      new Pt( -0.16666666666666666,  0.5, -0.5, 0.16666666666666666),\n      new Pt(  -1.5, 2,  0, -0.3333333333333333),\n      new Pt( 1.5,  -2.5,  0.5, 0.16666666666666666),\n      new Pt(  0.16666666666666666,  0,  0, 0)\n    );\n\n    let h = Mat.multiply( [step], m, true )[0].multiply( tension );\n    let h2 = (2*step[0] - 3*step[1] + 1);\n    let h3 = -2*step[0] + 3*step[1];\n\n    let pt = Curve._calcPt( ctrls, h );\n\n    pt.x += h2*ctrls[1].x + h3*ctrls[2].x;\n    pt.y += h2*ctrls[1].y + h3*ctrls[2].y;\n    if (pt.length > 2) pt.z += h2*ctrls[1].z + h3*ctrls[2].z;\n\n    return pt;\n  } \n\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Op.ts","// Source code licensed under Apache License 2.0. \n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport { Const } from \"./Util\";\nimport { Curve } from \"./Op\";\nimport { Pt, PtLike, Group, GroupLike } from \"./Pt\";\nimport { Vec, Mat } from \"./LinearAlgebra\";\n\n/**\n * Num class provides various helper functions for basic numeric operations\n */\nexport class Num {\n\n  /**\n   * Check if two numbers are equal or almost equal within a threshold\n   * @param a number a\n   * @param b number b\n   * @param threshold a threshold within which the two numbers are considered equal\n   */\n  static equals( a:number, b:number, threshold=0.00001 ):boolean {\n    return Math.abs( a-b ) < threshold;\n  }\n\n\n  /**\n   * Linear interpolation\n   * @param a start value\n   * @param b end value\n   * @param t usually a value between 0 to 1\n   */\n  static lerp( a:number, b:number, t:number ):number {\n    return (1 - t) * a + t * b;\n  }\n\n\n  /**\n   * Clamp values between min and max\n   * @param val value to clamp\n   * @param min min value\n   * @param max max value\n   */\n  static clamp( val:number, min:number, max:number ):number {\n    return Math.max(min, Math.min(max, val));\n  }\n\n\n  /**\n   * Different from Num.clamp in that the value out-of-bound will be \"looped back\" to the other end.\n   * @param val value to bound\n   * @param min min value\n   * @param max max value\n   * @example `boundValue(361, 0, 360)` will return 1\n   */\n  static boundValue( val:number, min:number, max:number ):number {\n    let len = Math.abs(max - min);\n    let a = val % len;\n\n    if (a > max) a -= len;\n    else if (a < min) a += len;\n\n    return a;\n  }\n\n\n  /**\n   * Check if a value is within \n   * @param p \n   * @param a \n   * @param b \n   */\n  static within( p:number, a:number, b:number ):boolean {\n    return p >= Math.min(a, b) && p <= Math.max(a, b);\n  }\n\n\n  /**\n   * Get a random number within a range\n   * @param a range value 1\n   * @param b range value 2\n   */\n  static randomRange( a:number, b:number = 0 ):number {\n    let r = (a > b) ? (a - b) : (b - a);\n    return a + Math.random() * r;\n  }\n\n\n  /**\n   * Normalize a value within a range\n   * @param n the value to normalize\n   * @param a range value 1\n   * @param b range value 1\n   */\n  static normalizeValue(n:number, a:number, b:number):number {\n    let min = Math.min(a, b);\n    let max = Math.max(a, b);\n    return (n - min) / (max - min);\n  }\n\n\n  /**\n   * Sum a group of numeric arrays\n   * @param pts an array of numeric arrays\n   * @returns a array of sums\n   */\n  static sum(pts: GroupLike|number[][]): Pt {\n    let c = new Pt( pts[0] );\n    for (let i = 1, len = pts.length; i < len; i++) {\n      Vec.add(c, pts[i]);\n    }\n    return c;\n  }\n\n\n  /**\n   * Sum a group of numeric arrays\n   * @param pts an array of numeric arrays\n   * @returns a array of sums\n   */\n  static average(pts: GroupLike|number[][]): Pt {\n    return Num.sum(pts).divide(pts.length);\n  }\n\n\n  /**\n   * Given a value between 0 to 1, returns a value that cycles between 0 -> 1 -> 0 using sine method.\n   * @param t a value between 0 to 1\n   * @return a value between 0 to 1\n   */\n  static cycle( t:number ):number {\n    return (Math.sin( Math.PI * 2 * t ) + 1) / 2;\n  }\n\n\n  /**  \n   * Map a value from one range to another\n   * @param n a value in the first range\n   * @param currMin lower bound of the first range\n   * @param currMax upper bound of the first range\n   * @param targetMin lower bound of the second range\n   * @param targetMax upper bound of the second range\n   * @returns a remapped value in the second range\n   */\n  static mapToRange(n:number, currA, currB, targetA, targetB) {\n    if (currA == currB) throw new Error(\"[currMin, currMax] must define a range that is not zero\");\n    let min = Math.min(targetA, targetB);\n    let max = Math.max(targetA, targetB);\n    return Num.normalizeValue(n, currA, currB) * (max - min) + min;\n  }\n}\n\n\n\n/**\n * Geom class provides various helper functions for basic geometric operations\n */\nexport class Geom {\n\n  /**\n   * Bound an angle between 0 to 360 degrees\n   */\n  static boundAngle( angle:number ):number {\n    return Num.boundValue(angle, 0, 360);\n  }\n\n\n  /**\n   * Bound a radian between 0 to 2-PI\n   */\n  static boundRadian( angle:number ):number {\n    return Num.boundValue(angle, 0, Const.two_pi);\n  }\n\n\n  /**\n   * Convert an angle in degree to radian\n   */\n  static toRadian( angle:number ):number {\n    return angle * Const.deg_to_rad;\n  }\n\n\n  /**\n   * Convert an angle in radian to degree\n   */\n  static toDegree( radian:number ):number {\n    return radian * Const.rad_to_deg;\n  }\n\n\n  /**\n   * Get a bounding box for a set of Pts\n   * @param pts a Group or an array of Pts\n   * @return a Group of two Pts, representing the top-left and bottom-right corners.\n   */\n  static boundingBox( pts:GroupLike ): Group {\n    let minPt = pts.reduce((a: Pt, p: Pt) => a.$min(p));\n    let maxPt = pts.reduce((a: Pt, p: Pt) => a.$max(p));\n    return new Group(minPt, maxPt);\n  }\n\n\n  /**\n   * Get a centroid (the average middle point) for a set of Pts\n   * @param pts a Group or an array of Pts\n   * @return a centroid Pt \n   */\n  static centroid( pts:GroupLike|number[][] ):Pt {\n    return Num.average(pts);\n  }\n\n\n  /**\n   * Given an anchor Pt, rebase all Pts in this group either to or from this anchor base.\n   * @param pts a Group or array of Pt\n   * @param ptOrIndex an index for the Pt array, or an external Pt\n   * @param direction \"to\" (subtract all Pt with this anchor base) or \"from\" (add all Pt from this anchor base)\n   */\n  static anchor( pts:GroupLike, ptOrIndex:PtLike|number=0, direction:(\"to\"|\"from\")=\"to\") {\n    let method = (direction == \"to\") ? \"subtract\" : \"add\";\n    for (let i = 0, len = pts.length; i < len; i++) {\n      if (typeof ptOrIndex == \"number\") {\n        if (ptOrIndex !== i) pts[i][method](pts[ptOrIndex]);\n      } else {\n        pts[i][method](ptOrIndex);\n      }\n    }\n  }\n\n\n  /**\n   * Get an interpolated (or extrapolated) value between two Pts\n   * @param a first Pt\n   * @param b second Pt\n   * @param t a value between 0 to 1 to interpolate, or any other value to extrapolate\n   * @returns interpolated point as a new Pt\n   */\n  static interpolate( a:Pt|number[], b:Pt|number[], t:number=0.5 ):Pt {\n    let len = Math.min(a.length, b.length);\n    let d = Pt.make(len);\n    for (let i = 0; i < len; i++) {\n      d[i] = a[i] * (1 - t) + b[i] * t;\n    }\n    return d;\n  }\n\n\n  /**\n   * Find two Pt that are perpendicular to this Pt (2D)\n   * @param axis a string such as \"xy\" (use Const.xy) or an array to specify index for two dimensions\n   * @returns an array of two Pt that are perpendicular to this Pt\n   */\n  static perpendicular( pt:PtLike, axis:string|number[]=Const.xy ):Group {\n    let y = axis[1];\n    let x = axis[0];\n\n    let p = new Pt(pt);\n    let pa = new Pt(p);\n    pa[x] = -p[y];\n    pa[y] = p[x];\n    let pb = new Pt(p);\n    pb[x] = p[y];\n    pb[y] = -p[x];\n\n    return new Group(pa, pb);\n  }\n\n\n  /**\n   * Check if two Pts (vectors) are perpendicular to each other \n   */\n  static isPerpendicular( p1:PtLike, p2:PtLike ):boolean {\n    return new Pt(p1).dot(p2) === 0;\n  }\n\n\n  /**\n   * Check if a Pt is within the rectangular boundary defined by two Pts\n   * @param pt the Pt to check\n   * @param boundPt1 boundary Pt 1\n   * @param boundPt2 boundary Pt 2\n   */\n  static withinBound( pt:PtLike|number[], boundPt1:PtLike|number[], boundPt2:PtLike|number[] ):boolean {\n    for (let i = 0, len = Math.min(pt.length, boundPt1.length, boundPt2.length); i < len; i++) {\n      if (!Num.within(pt[i], boundPt1[i], boundPt2[i])) return false;\n    }\n    return true;\n  }\n\n\n  /**\n   * Sort the Pts so that their edges will form a non-overlapping polygon\n   * Ref: https://stackoverflow.com/questions/6989100/sort-points-in-clockwise-order\n   * @param pts an array of Pts\n   */\n  static sortEdges( pts:GroupLike ):GroupLike {\n\n    let bounds = Geom.boundingBox( pts );\n    let center = bounds[1].add(bounds[0]).divide(2);\n    \n    let fn = ( a:Pt, b:Pt ):number => {\n      if (a.length < 2 || b.length < 2) throw new Error( \"Pt dimension cannot be less than 2\");\n\n      let da = a.$subtract( center );\n      let db = b.$subtract( center );\n      \n      if (da[0] >= 0 && db[0] < 0) return 1;\n      if (da[0] < 0 && db[0] >= 0) return -1;\n      if (da[0] == 0 && db[0] == 0) {\n          if (da[1] >= 0 || db[1] >= 0)\n              return (da[1] > db[1]) ? 1 : -1;\n          return (db[1] > da[1]) ? 1 : -1;\n      }\n\n      // compute the cross product of vectors (center -> a) x (center -> b)\n      let det = da.cross2D( db );\n      if (det < 0) return 1;\n      if (det > 0) return -1;\n      \n      // points a and b are on the same line from the center\n      // check which point is closer to the center\n      return (da[0]*da[0] + da[1]*da[1] > db[0]*db[0] + db[1]*db[1]) ? 1 : -1;\n    };\n\n    return pts.sort( fn );\n  }\n\n\n  /**\n   * Scale a Pt or a Group of Pts\n   * @param ps a Pt or a Group of Pts\n   * @param scale scale value\n   * @param anchor optional anchor point to scale from\n   */\n  static scale( ps:Pt|GroupLike, scale:number|number[]|PtLike, anchor?:PtLike ):Geom {\n    let pts = (!Array.isArray(ps)) ? [ps] : ps;\n    let scs = (typeof scale == \"number\") ? Pt.make(pts[0].length, scale) : scale;\n    if (!anchor) anchor = Pt.make(pts[0].length, 0);\n\n    for (let i = 0, len = pts.length; i < len; i++) {\n      let p = pts[i];\n      for (let k = 0, lenP = p.length; k < lenP; k++) {\n        p[k] = (anchor && anchor[k]) ? anchor[k] + (p[k] - anchor[k]) * scs[k] : p[k] * scs[k];\n      }\n    }\n\n    return Geom;\n  }\n\n\n  /**\n   * Rotate a Pt or a Group of Pts in 2D space\n   * @param ps a Pt or a Group of Pts\n   * @param angle rotate angle\n   * @param anchor optional anchor point to rotate from\n   * @param axis optional axis such as \"yz\" to define a 2D plane of rotation\n   */\n  static rotate2D( ps:Pt|GroupLike, angle:number, anchor?:PtLike, axis?:string ):Geom {\n    let pts = (!Array.isArray(ps)) ? [ps] : ps;\n    let fn = (anchor) ? Mat.rotateAt2DMatrix : Mat.rotate2DMatrix;\n    if (!anchor) anchor = Pt.make(pts[0].length, 0);\n    let cos = Math.cos(angle);\n    let sin = Math.sin(angle);\n\n    for (let i = 0, len = pts.length; i < len; i++) {\n      let p = (axis) ? pts[i].$take(axis) : pts[i];\n      p.to(Mat.transform2D(p, fn(cos, sin, anchor)));\n    }\n\n    return Geom;\n  }\n\n\n  /**\n   * Shear a Pt or a Group of Pts in 2D space\n   * @param ps a Pt or a Group of Pts\n   * @param scale shearing value which can be a number or an array of 2 numbers\n   * @param anchor optional anchor point to shear from\n   * @param axis optional axis such as \"yz\" to define a 2D plane of shearing\n   */\n  static shear2D( ps:Pt|GroupLike, scale:number|number[]|PtLike, anchor?:PtLike, axis?:string):Geom {\n    let pts = (!Array.isArray(ps)) ? [ps] : ps;\n    let s = (typeof scale == \"number\") ? [scale, scale] : scale;\n    if (!anchor) anchor = Pt.make(pts[0].length, 0);\n    let fn = (anchor) ? Mat.shearAt2DMatrix : Mat.shear2DMatrix;\n    let tanx = Math.tan(s[0]);\n    let tany = Math.tan(s[1]);\n\n    for (let i = 0, len = pts.length; i < len; i++) {\n      let p = (axis) ? pts[i].$take(axis) : pts[i];\n      p.to(Mat.transform2D(p, fn(tanx, tany, anchor)));\n    }\n\n    return Geom;\n  }\n\n\n  /**\n   * Reflect a Pt or a Group of Pts along a 2D line\n   * @param ps a Pt or a Group of Pts\n   * @param line a Group of 2 Pts that defines a line for reflection\n   * @param axis optional axis such as \"yz\" to define a 2D plane of reflection\n   */\n  static reflect2D( ps:Pt|GroupLike, line:GroupLike, axis?:string ):Geom {\n    let pts = (!Array.isArray(ps)) ? [ps] : ps;\n\n    for (let i = 0, len = pts.length; i < len; i++) {\n      let p = (axis) ? pts[i].$take(axis) : pts[i];\n      p.to(Mat.transform2D(p, Mat.reflectAt2DMatrix(line[0], line[1])));\n    }\n\n    return Geom;\n  }\n\n\n  /**\n   * Generate a sine and cosine lookup table\n   * @returns an object with 2 tables (array of 360 values) and 2 functions to get sin/cos given a radian parameter. { sinTable:Float64Array, cosTable:Float64Array, sin:(rad)=>number, cos:(rad)=>number }\n   */\n  static cosTable() {\n    let cos = new Float64Array(360);\n\n    for (let i = 0; i < 360; i++) cos[i] = Math.cos(i * Math.PI / 180);\n    let find = (rad:number) => cos[Math.floor(Geom.boundAngle(Geom.toDegree(rad)))];\n\n    return { table: cos, cos: find };\n  }\n\n  /**\n   * Generate a sine and cosine lookup table\n   * @returns an object with 2 tables (array of 360 values) and 2 functions to get sin/cos given a radian parameter. { sinTable:Float64Array, cosTable:Float64Array, sin:(rad)=>number, cos:(rad)=>number }\n   */\n  static sinTable() {\n    let sin = new Float64Array(360);\n\n    for (let i = 0; i < 360; i++) sin[i] = Math.sin(i * Math.PI / 180);\n    let find = (rad:number) => sin[Math.floor(Geom.boundAngle(Geom.toDegree(rad)))];\n\n    return { table: sin, sin: find };\n  }\n}\n\n\n\n/**\n * Shaping provides various shaping/easing functions to interpolate a value non-linearly.\n */\nexport class Shaping {\n\n  /**\n   * Linear mapping\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static linear(t:number, c:number = 1):number {\n    return c * t;\n  }\n\n  /** \n   * Quadratic in, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n  */\n  static quadraticIn(t:number, c:number = 1):number {\n    return c * t * t;\n  }\n\n  /** \n   * Quadratic out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n  */\n  static quadraticOut(t:number, c:number = 1):number {\n    return -c * t * (t - 2);\n  }\n\n  /** \n   * Quadratic in-out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static quadraticInOut(t:number, c:number = 1):number {\n    let dt = t * 2;\n    return (t < 0.5) ? c / 2 * t * t * 4 : -c / 2 * ((dt - 1) * (dt - 3) - 1);\n  }\n\n  /** \n   * Cubic in, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static cubicIn(t:number, c:number = 1):number {\n    return c * t * t * t;\n  }\n\n  /** \n   * Cubic out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static cubicOut(t:number, c:number = 1):number {\n    let dt = t - 1;\n    return c * (dt * dt * dt + 1);\n  }\n\n  /** \n   * Cubic in-out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static cubicInOut(t:number, c:number = 1):number {\n    let dt = t * 2;\n    return (t < 0.5) ? c / 2 * dt * dt * dt : c / 2 * ((dt - 2) * (dt - 2) * (dt - 2) + 2);\n  }\n\n  /** \n   * Exponential ease In, adapted from Golan Levin's [polynomial shapers](http://www.flong.com/texts/code/shapers_poly/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p a value between 0 to 1 to control the curve. Default is 0.25.\n   */\n  static exponentialIn(t:number, c:number = 1, p:number = 0.25):number {\n    return c * Math.pow(t, 1 / p);\n  }\n\n  /** \n   * Exponential ease out, adapted from Golan Levin's [polynomial shapers](http://www.flong.com/texts/code/shapers_poly/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p a value between 0 to 1 to control the curve. Default is 0.25.\n   */\n  static exponentialOut(t:number, c:number = 1, p:number = 0.25):number {\n    return c * Math.pow(t, p);\n  }\n\n  /** \n   * Sinuous in, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static sineIn(t:number, c:number = 1):number {\n    return -c * Math.cos(t * Const.half_pi) + c;\n  }\n\n  /** \n   * Sinuous out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static sineOut(t:number, c:number = 1):number {\n    return c * Math.sin(t * Const.half_pi);\n  }\n\n  /** \n   * Sinuous in-out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static sineInOut(t:number, c:number = 1):number {\n    return -c / 2 * (Math.cos(Math.PI * t) - 1);\n  }\n\n  /** \n   * A faster way to approximate cosine ease in-out using Blinn-Wyvill Approximation. Adapated from Golan Levin's [polynomial shaping](http://www.flong.com/texts/code/shapers_poly/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static cosineApprox(t:number, c:number = 1) {\n    let t2 = t * t;\n    let t4 = t2 * t2;\n    let t6 = t4 * t2;\n    return c * (4 * t6 / 9 - 17 * t4 / 9 + 22 * t2 / 9);\n  }\n\n  /** \n   * Circular in, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static circularIn(t:number, c:number = 1):number {\n    return -c * (Math.sqrt(1 - t * t) - 1);\n  }\n\n  /** \n   * Circular out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static circularOut(t:number, c:number = 1):number {\n    let dt = t - 1;\n    return c * Math.sqrt(1 - dt * dt);\n  }\n\n  /** \n   * Circular in-out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static circularInOut(t:number, c:number = 1):number {\n    let dt = t * 2;\n    return (t < 0.5) ? -c / 2 * (Math.sqrt(1 - dt * dt) - 1) : c / 2 * (Math.sqrt(1 - (dt - 2) * (dt - 2)) + 1);\n  }\n\n  /** \n   * Elastic in, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p elastic parmeter between 0 to 1. The lower the number, the more elastic it will be. Default is 0.7.\n   */\n  static elasticIn(t:number, c:number = 1, p:number = 0.7):number {\n    let dt = t - 1;\n    let s = (p / Const.two_pi) * 1.5707963267948966;\n    return c * (-Math.pow(2, 10 * dt) * Math.sin((dt - s) * Const.two_pi / p));\n  }\n\n  /** \n   * Elastic out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p elastic parmeter between 0 to 1. The lower the number, the more elastic it will be. Default is 0.7.\n   */\n  static elasticOut(t:number, c:number = 1, p:number = 0.7):number {\n    let s = (p / Const.two_pi) * 1.5707963267948966;\n    return c * (Math.pow(2, -10 * t) * Math.sin((t - s) * Const.two_pi / p)) + c;\n  }\n\n  /** \n   * Elastic in-out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p elastic parmeter between 0 to 1. The lower the number, the more elastic it will be. Default is 0.6.\n   */\n  static elasticInOut(t:number, c:number = 1, p:number = 0.6):number {\n    let dt = t * 2;\n    let s = (p / Const.two_pi) * 1.5707963267948966;\n    if (t < 0.5) {\n      dt -= 1;\n      return c * (-0.5 * (Math.pow(2, 10 * dt) * Math.sin((dt - s) * Const.two_pi / p)));\n    } else {\n      dt -= 1;\n      return c * (0.5 * (Math.pow(2, -10 * dt) * Math.sin((dt - s) * Const.two_pi / p))) + c;\n    }\n  }\n\n  /** \n   * Bounce in, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static bounceIn(t:number, c:number = 1):number {\n    return c - Shaping.bounceOut((1 - t), c);\n  }\n\n  /** \n   * Bounce out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static bounceOut(t:number, c:number = 1) {\n    if (t < (1 / 2.75)) {\n      return c * (7.5625 * t * t);\n    } else if (t < (2 / 2.75)) {\n      t -= 1.5 / 2.75;\n      return c * (7.5625 * t * t + 0.75);\n    } else if (t < (2.5 / 2.75)) {\n      t -= 2.25 / 2.75;\n      return c * (7.5625 * t * t + 0.9375);\n    } else {\n      t -= 2.625 / 2.75;\n      return c * (7.5625 * t * t + 0.984375);\n    }\n  }\n\n  /** \n   * Bounce in-out, adapted from Robert Penner's [easing functions](http://robertpenner.com/easing/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   */\n  static bounceInOut(t:number, c:number = 1):number {\n    return (t < 0.5) ? Shaping.bounceIn(t * 2, c) / 2 : Shaping.bounceOut(t * 2 - 1, c) / 2 + c / 2;\n  }\n\n  /** \n   * Sigmoid curve changes its shape adapted from the input value, but always returns a value between 0 to 1.\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p the larger the value, the \"steeper\" the curve will be. Default is 10.\n   */\n  static sigmoid(t:number, c:number = 1, p:number = 10):number {\n    let d = p * (t - 0.5);\n    return c / (1 + Math.exp(-d));\n  }\n\n  /** \n   * The Logistic Sigmoid is a useful curve. Adapted from Golan Levin's [shaping function](http://www.flong.com/texts/code/shapers_exp/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p a parameter between 0 to 1 to control the steepness of the curve. Higher is steeper. Default is 0.7.\n   */\n  static logSigmoid(t:number, c:number = 1, p:number = 0.7):number {\n    p = Math.max(Const.epsilon, Math.min(1 - Const.epsilon, p));\n    p = 1 / (1 - p);\n\n    let A = 1 / (1 + Math.exp(((t - 0.5) * p * -2)));\n    let B = 1 / (1 + Math.exp(p));\n    let C = 1 / (1 + Math.exp(-p));\n    return c * (A - B) / (C - B);\n  }\n\n\n  /** \n   * An exponential seat curve. Adapted from Golan Levin's [shaping functions](http://www.flong.com/texts/code/shapers_exp/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p a parameter between 0 to 1 to control the steepness of the curve. Higher is steeper. Default is 0.5.\n   */\n  static seat(t:number, c:number = 1, p:number = 0.5):number {\n    if ((t < 0.5)) {\n      return c * (Math.pow(2 * t, 1 - p)) / 2;\n    } else {\n      return c * (1 - (Math.pow(2 * (1 - t), 1 - p)) / 2);\n    }\n  }\n\n\n  /** \n   * Quadratic bezier curve. Adapted from Golan Levin's [shaping functions](http://www.flong.com/texts/code/shapers_exp/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p1 a Pt object specifying the first control Pt, or a value specifying the control Pt's x position (its y position will default to 0.5). Default is `Pt(0.95, 0.95)\n   */\n  static quadraticBezier(t:number, c:number = 1, p:number|PtLike=[0.05, 0.95] ):number {\n    let a:number = (typeof p != \"number\") ? p[0] : p;\n    let b:number = (typeof p != \"number\") ? p[1] : 0.5;\n    let om2a = 1 - 2 * a;\n    if (om2a === 0) {\n      om2a = Const.epsilon;\n    }\n    let d = (Math.sqrt(a * a + om2a * t) - a) / om2a;\n    return c * ((1 - 2 * b) * (d * d) + (2 * b) * d);\n  }\n\n\n  /** \n   * Cubic bezier curve. This reuses the bezier functions in Curve class.\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p1` a Pt object specifying the first control Pt. Default is `Pt(0.1, 0.7).\n   * @parma p2` a Pt object specifying the second control Pt. Default is `Pt(0.9, 0.2).\n   */\n  static cubicBezier(t:number, c:number = 1, p1:PtLike=[0.1, 0.7], p2:PtLike=[0.9, 0.2] ):number {\n    let curve = new Group( new Pt(0, 0), new Pt(p1), new Pt(p2), new Pt(1, 1) );\n    return c * Curve.bezierStep(new Pt(t*t*t, t*t, t, 1), Curve.controlPoints(curve)).y;\n  }\n\n\n  /** \n   * Give a Pt, draw a quadratic curve that will pass through that Pt as closely as possible. Adapted from Golan Levin's [shaping functions](http://www.flong.com/texts/code/shapers_poly/)\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p1` a Pt object specifying the Pt to pass through. Default is `Pt(0.2, 0.35)\n   */\n  static quadraticTarget(t:number, c:number = 1, p1:PtLike = [0.2, 0.35]):number {\n    let a = Math.min(1 - Const.epsilon, Math.max( Const.epsilon, p1[0] ));\n    let b = Math.min(1, Math.max( 0, p1[1] ));\n    let A = (1 - b) / (1 - a) - (b / a);\n    let B = (A * (a * a) - b) / a;\n    let y = A * (t * t) - B * t;\n    return c * Math.min(1, Math.max(0, y));\n  }\n\n\n  /** \n   * Step function is a simple jump from 0 to 1 at a specific Pt in time\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma p usually a value between 0 to 1, which specify the Pt to \"jump\". Default is 0.5 which is in the middle.\n   */\n  static cliff(t:number, c:number = 1, p:number = 0.5):number {\n    return (t > p) ? c : 0;\n  }\n\n  /** \n   * Convert any shaping functions into a series of steps\n   * @parma fn the original shaping function\n   * @parma steps the number of steps\n   * @parma t a value between 0 to 1\n   * @parma c the value to shape, default is 1\n   * @parma args optional paramters to pass to original function\n   */\n  static step(fn: Function, steps:number, t:number, c:number, ...args:any[]) {\n    let s = 1 / steps;\n    let tt = Math.floor(t / s) * s;\n    return fn(tt, c, ...args);\n  }\n\n}\n\n\n/**\n * Range object keeps track of a Group of n-dimensional Pts to provide its minimum, maximum, and magnitude in each dimension. \n * It also provides convenient functions such as mapping the Group to another range.\n */\nexport class Range {\n\n  protected _source:Group;\n  protected _max:Pt;\n  protected _min:Pt;\n  protected _mag:Pt;\n  protected _dims:number = 0;\n\n\n  /**\n   * Construct a Range instance for a Group of Pts, \n   * @param g a Group or an array of Pts\n   */\n  constructor( g:GroupLike ) {\n    this._source = Group.fromPtArray( g );\n    this.calc();\n  }\n\n  /**\n   * Get this Range's maximum values per dimension\n   */\n  get max():Pt { return this._max.clone(); }\n  \n  /**\n   * Get this Range's minimum values per dimension\n   */\n  get min():Pt { return this._min.clone(); }\n  \n  /**\n   * Get this Range's magnitude in each dimension\n   */\n  get magnitude():Pt { return this._mag.clone(); }\n\n\n  /**\n   * Go through the group and find its min and max values.\n   * Usually you don't need to call this function directly.\n   */\n  calc():this {\n    if (!this._source) return;\n    let dims = this._source[0].length;\n    this._dims = dims;\n    let max = new Pt( dims );\n    let min = new Pt( dims );\n    let mag = new Pt( dims );\n\n    for (let i=0; i<dims; i++) {\n      max[i] = Const.min;\n      min[i] = Const.max;\n      mag[i] = 0;\n\n      let s = this._source.zipSlice( i );\n      for (let k=0, len=s.length; k<len; k++) {\n        max[i] = Math.max( max[i], s[k] );\n        min[i] = Math.min( min[i], s[k] );\n        mag[i] = max[i] - min[i];\n      }\n    }\n\n    this._max = max;\n    this._min = min;\n    this._mag = mag;\n    return this;\n  }\n\n\n  /**\n   * Map this Range to another range of values\n   * @param min target range's minimum value\n   * @param max target range's maximum value\n   * @param exclude Optional boolean array where `true` means excluding the conversion in that specific dimension.\n   */\n  mapTo( min:number, max:number, exclude?:boolean[] ):Group {\n    let target = new Group();\n    for (let i=0, len=this._source.length; i<len; i++) {\n      let g = this._source[i];\n      let n = new Pt( this._dims );\n      for (let k=0; k<this._dims; k++) {\n        n[k] = (exclude && exclude[k]) ? g[k] : Num.mapToRange( g[k], this._min[k], this._max[k], min, max ); \n      }\n      target.push( n ); \n    }\n    return target;\n  }\n\n\n  /**\n   * Add more Pts to this Range and recalculate its min and max values\n   * @param g a Group or an array of Pts to append to this Range\n   * @param update Optional. Set the parameter to `false` if you want to append without immediately updating this Range's min and max values. Default is `true`.\n   */\n  append( g:GroupLike, update:boolean=true ):this {\n    if (g[0].length !== this._dims) throw new Error(`Dimensions don't match. ${this._dims} dimensions in Range and ${g[0].length} provided in parameter. `);\n    this._source = this._source.concat( g ) as Group;\n    if (update) this.calc();\n    return this;\n  }\n\n\n  /**\n   * Create a number of evenly spaced \"ticks\" that span this Range's min and max value.\n   * @param count number of subdivision. For example, 10 subdivision will return 11 tick values, which include first(min) and last(max) values.\n   */\n  ticks( count:number ):Group {\n    let g = new Group();\n    for (let i=0; i<=count; i++) {\n      let p = new Pt( this._dims );\n      for (let k=0, len=this._max.length; k<len; k++) {\n        p[k] = Num.lerp( this._min[k], this._max[k], i/count );\n      }\n      g.push( p );\n    }\n    return g;\n  }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Num.ts","// Source code licensed under Apache License 2.0. \n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport {Pt, PtLike, GroupLike, Group} from \"./Pt\";\nimport {Line} from \"./Op\";\n\n\n/**\n * Vec provides static function for vector operations. It's not yet optimized but good enough to use.\n */\nexport class Vec {\n\n  /**\n   * Add b to vector `a`\n   * @returns vector `a`\n   */\n  static add( a:PtLike, b:PtLike|number ):PtLike {\n    if (typeof b == \"number\") {\n      for (let i=0, len=a.length; i<len; i++) a[i] += b;\n    } else {\n      for (let i=0, len=a.length; i<len; i++) a[i] += b[i] || 0;\n    }\n    return a;\n  }\n\n  /**\n   * Subtract `b` from vector `a`\n   * @returns vector `a`\n   */\n  static subtract( a:PtLike, b:PtLike|number ):PtLike {\n    if (typeof b == \"number\") {\n      for (let i=0, len=a.length; i<len; i++) a[i] -= b;\n    } else {\n      for (let i=0, len=a.length; i<len; i++) a[i] -= b[i] || 0;\n    }\n    return a;\n  }\n\n  /**\n   * Multiply `b` with vector `a`\n   * @returns vector `a`\n   */\n  static multiply( a:PtLike, b:PtLike|number ):PtLike {\n    if (typeof b == \"number\") {\n      for (let i=0, len=a.length; i<len; i++) a[i] *= b;\n    } else {\n      if (a.length != b.length) {\n        throw new Error(`Cannot do element-wise multiply since the array lengths don't match: ${a.toString()} multiply-with ${b.toString()}`);\n      }\n      for (let i=0, len=a.length; i<len; i++) a[i] *= b[i];\n    }\n    return a;\n  }\n\n\n  /**\n   * Divide `a` over `b`\n   * @returns vector `a`\n   */\n  static divide( a:PtLike, b:PtLike|number ):PtLike {\n    if (typeof b == \"number\") {\n      if (b === 0) throw new Error(\"Cannot divide by zero\");\n      for (let i=0, len=a.length; i<len; i++) a[i] /= b;\n    } else {\n      if (a.length != b.length) {\n        throw new Error(`Cannot do element-wise divide since the array lengths don't match. ${a.toString()} divide-by ${b.toString()}`);\n      }\n      for (let i=0, len=a.length; i<len; i++) a[i] /= b[i];\n    }\n    return a;\n  }\n\n\n  /**\n   * Dot product of `a` and `b`\n   */\n  static dot( a:PtLike, b:PtLike ):number {\n    if (a.length != b.length) throw new Error(\"Array lengths don't match\");\n    let d = 0;\n    for (let i=0, len=a.length; i<len; i++) {\n      d += a[i]*b[i];\n    }\n    return d;\n  } \n\n  \n  /**\n   * 2D cross product of `a` and `b`\n   */\n  static cross2D( a:PtLike, b:PtLike ):number {\n    return a[0]*b[1] - a[1]*b[0];\n  }\n\n  /**\n   * 3D Cross product of `a` and `b`\n   */\n  static cross( a:PtLike, b:PtLike ):Pt {\n    return new Pt( (a[1]*b[2] - a[2]*b[1]), (a[2]*b[0] - a[0]*b[2]), (a[0]*b[1] - a[1]*b[0]) );\n  }\n\n\n  /**\n   * Magnitude of `a`\n   */\n  static magnitude( a:PtLike ):number {\n    return Math.sqrt( Vec.dot( a, a ) );\n  }\n\n\n  /**\n   * Unit vector of `a`. If magnitude of `a` is already known, pass it in the second paramter to optimize calculation.\n   */\n  static unit( a:PtLike, magnitude:number=undefined ):PtLike {\n    let m = (magnitude===undefined) ? Vec.magnitude(a) : magnitude;\n    if (m===0) throw new Error(\"Cannot calculate unit vector because magnitude is 0\");\n    return Vec.divide( a, m );\n  }\n\n\n  /**\n   * Set `a` to its absolute value in each dimension\n   * @returns vector `a`\n   */\n  static abs( a:PtLike ):PtLike {\n    return Vec.map( a, Math.abs );\n  }\n\n\n  /**\n   * Set `a` to its floor value in each dimension\n   * @returns vector `a`\n   */\n  static floor( a:PtLike ):PtLike {\n    return Vec.map( a, Math.floor );\n  }\n\n\n  /**\n   * Set `a` to its ceiling value in each dimension\n   * @returns vector `a`\n   */\n  static ceil( a:PtLike ):PtLike {\n    return Vec.map( a, Math.ceil );\n  }\n\n\n  /**\n   * Set `a` to its rounded value in each dimension\n   * @returns vector `a`\n   */\n  static round( a:PtLike ):PtLike {\n    return Vec.map( a, Math.round );\n  }\n\n  \n  /**\n   * Find the max value within a vector's dimensions\n   * @returns an object with `value` and `index` that specifies the max value and its corresponding dimension.\n   */\n  static max( a:PtLike ):{value, index} {\n    let m = Number.MIN_VALUE;\n    let index = 0;\n    for (let i=0, len=a.length; i<len; i++) {\n      m = Math.max( m, a[i] );\n      if (m === a[i]) index = i;\n    }\n    return {value: m, index: index};\n  }\n\n\n  /**\n   * Find the min value within a vector's dimensions\n   * @returns an object with `value` and `index` that specifies the min value and its corresponding dimension.\n   */\n  static min( a:PtLike ):{value, index} {\n    let m = Number.MAX_VALUE;\n    let index = 0;\n    for (let i=0, len=a.length; i<len; i++) {\n      m = Math.min( m, a[i] );\n      if (m === a[i]) index = i;\n    }\n    return {value: m, index: index};\n  }\n\n\n  /**\n   * Sum all the dimensions' values\n   */\n  static sum( a:PtLike ):number {\n    let s = 0;\n    for (let i=0, len=a.length; i<len; i++) s += a[i];\n    return s;\n  }\n\n\n  /**\n   * Given a mapping function, update `a`'s value in each dimension\n   * @returns vector `a`\n   */\n  static map( a:PtLike, fn:(n:number, index:number, arr) => number ):PtLike {\n    for (let i=0, len=a.length; i<len; i++) {\n      a[i] = fn( a[i], i, a );\n    }\n    return a;\n  }\n  \n}\n\n\n/**\n * Mat provides static function for matrix operations. It's not yet optimized but good enough to use.\n */\nexport class Mat {\n\n  /**\n   * Matrix additions. Matrices should have the same rows and columns.\n   * @param a a group of Pt\n   * @param b a scalar number, an array of numeric arrays, or a group of Pt\n   * @returns a group with the same rows and columns as a and b\n   */\n  static add( a:GroupLike, b:GroupLike|number[][]|number ):Group {\n    if ( typeof b != \"number\" ) {\n      if (a[0].length != b[0].length) throw new Error(\"Cannot add matrix if rows' and columns' size don't match.\");\n      if (a.length != b.length) throw new Error(\"Cannot add matrix if rows' and columns' size don't match.\");\n    }\n\n    let g = new Group();\n    let isNum = typeof b == \"number\"; \n    for (let i=0, len=a.length; i<len; i++) {\n      g.push( a[i].$add( (isNum) ? b : b[i] ) );\n    }\n\n    return g;\n  }\n\n\n  /**\n   * Matrix multiplication\n   * @param a a Group of M Pts, each with K dimensions (M-rows, K-columns)\n   * @param b a scalar number, an array of numeric arrays, or a Group of K Pts, each with N dimensions (K-rows, N-columns) -- or if transposed is true, then N Pts with K dimensions\n   * @param transposed (Only applicable if it's not elementwise multiplication) If true, then a and b's columns should match (ie, each Pt should have the same dimensions). Default is `false`.\n   * @param elementwise if true, then the multiplication is done element-wise. Default is `false`.\n   * @returns If not elementwise, this will return a group with M Pt, each with N dimensions (M-rows, N-columns).\n   */\n  static multiply( a:GroupLike, b:GroupLike|number[][]|number, transposed:boolean=false, elementwise:boolean=false ):Group {\n    \n    let g = new Group();\n\n    if (typeof b != \"number\") {\n\n      if (elementwise) {\n        if (a.length != b.length) throw new Error(\"Cannot multiply matrix element-wise because the matrices' sizes don't match.\");\n        for (let ai = 0, alen = a.length; ai < alen; ai++) {\n          g.push( a[ai].$multiply( b[ai] ) );\n        }\n\n      } else {\n        \n        if (!transposed && a[0].length != b.length) throw new Error(\"Cannot multiply matrix if rows in matrix-a don't match columns in matrix-b.\");\n        if (transposed && a[0].length != b[0].length) throw new Error(\"Cannot multiply matrix if transposed and the columns in both matrices don't match.\");\n\n        if (!transposed) b = Mat.transpose( b );\n\n        for (let ai = 0, alen = a.length; ai < alen; ai++) {\n          let p = Pt.make( b.length, 0 );\n          for (let bi = 0, blen = b.length; bi < blen; bi++) {\n            p[bi] = Vec.dot( a[ai], b[bi] );\n          }\n          g.push(p);\n        }\n      }\n\n    } else {\n      for (let ai = 0, alen = a.length; ai < alen; ai++) {\n        g.push( a[ai].$multiply(b) );\n      }\n    }\n\n    return g;\n  }\n\n\n  /**\n   * Zip one slice of an array of Pt. Imagine the Pts are organized in rows, then this function will take the values in a specific column.\n   * @param g a group of Pt\n   * @param idx index to zip at\n   * @param defaultValue a default value to fill if index out of bound. If not provided, it will throw an error instead.\n   */\n  static zipSlice( g:GroupLike|number[][], index:number, defaultValue:number|boolean = false ):Pt {\n    let z = [];\n    for (let i=0, len=g.length; i<len; i++) {\n      if (g[i].length-1 < index && defaultValue === false) throw `Index ${index} is out of bounds`;\n      z.push( g[i][index] || defaultValue );\n    }\n    return new Pt(z);\n  }\n\n\n  /**\n   * Zip a group of Pt. eg, [[1,2],[3,4],[5,6]] => [[1,3,5],[2,4,6]]\n   * @param g a group of Pt\n   * @param defaultValue a default value to fill if index out of bound. If not provided, it will throw an error instead.\n   * @param useLongest If true, find the longest list of values in a Pt and use its length for zipping. Default is false, which uses the first item's length for zipping.\n   */\n  static zip( g:GroupLike|number[][], defaultValue:number|boolean = false, useLongest=false ):Group {\n    let ps = new Group();\n    let len:number = (useLongest) ? (g as Array<number[]|Pt>).reduce( (a,b) => Math.max(a, b.length), 0 ) : g[0].length;\n    for (let i=0; i<len; i++) {\n      ps.push( Mat.zipSlice( g, i, defaultValue ) );\n    }\n    return ps;\n  }\n\n\n  /**\n   * Same as `zip` function\n   */\n  static transpose( g:GroupLike|number[][], defaultValue:number|boolean = false, useLongest=false ):Group {\n    return Mat.zip( g, defaultValue, useLongest );\n  }\n\n\n  /**\n   * Transform a 2D point given a 2x3 or 3x3 matrix\n   * @param pt a Pt to be transformed\n   * @param m 2x3 or 3x3 matrix\n   * @returns a new transformed Pt\n   */\n  static transform2D( pt:PtLike, m:GroupLike|number[][] ):Pt {\n    let x = pt[0] * m[0][0] + pt[1] * m[1][0] + m[2][0];\n    let y = pt[0] * m[0][1] + pt[1] * m[1][1] + m[2][1];\n    return new Pt(x, y);\n  }\n\n\n  /**\n   * Get a scale matrix for use in `transform2D`\n   */\n  static scale2DMatrix( x:number, y:number ):GroupLike {\n    return new Group(\n      new Pt( x, 0, 0 ),\n      new Pt( 0, y, 0 ),\n      new Pt( 0, 0, 1 )\n    );\n  }\n\n\n  /**\n   * Get a rotate matrix for use in `transform2D`\n   */\n  static rotate2DMatrix( cosA:number, sinA:number ):GroupLike {\n    return new Group(\n      new Pt( cosA, sinA, 0 ),\n      new Pt( -sinA, cosA, 0, ),\n      new Pt( 0, 0, 1 )\n    );\n  }\n\n\n  /**\n   * Get a shear matrix for use in `transform2D`\n   */\n  static shear2DMatrix( tanX:number, tanY:number ):GroupLike {\n    return new Group(\n      new Pt( 1, tanX, 0 ),\n      new Pt( tanY, 1, 0 ),\n      new Pt( 0, 0, 1 )\n    );\n  }\n\n\n  /**\n   * Get a translate matrix for use in `transform2D`\n   */\n  static translate2DMatrix( x:number, y:number ):GroupLike {\n    return new Group(\n      new Pt( 1, 0, 0 ),\n      new Pt( 0, 1, 0 ),\n      new Pt( x, y, 1 )\n    );\n  }\n\n\n  /**\n   * Get a matrix to scale a point from an origin point. For use in `transform2D`\n   */\n  static scaleAt2DMatrix( sx:number, sy:number, at:PtLike ):GroupLike {\n    let m = Mat.scale2DMatrix(sx, sy);\n    m[2][0] = -at[0]*sx + at[0];\n    m[2][1] = -at[1]*sy + at[1];\n    return m;\n  }\n\n\n  /**\n   * Get a matrix to rotate a point from an origin point. For use in `transform2D`\n   */\n  static rotateAt2DMatrix( cosA:number, sinA:number, at:PtLike ):GroupLike {\n    let m = Mat.rotate2DMatrix(cosA, sinA);\n    m[2][0] = at[0]*(1-cosA) + at[1]*sinA;\n    m[2][1] = at[1]*(1-cosA) - at[0]*sinA;\n    return m;\n  }\n\n\n  /**\n   * Get a matrix to shear a point from an origin point. For use in `transform2D`\n   */\n  static shearAt2DMatrix( tanX:number, tanY:number, at:PtLike ):GroupLike {\n    let m = Mat.shear2DMatrix(tanX, tanY);\n    m[2][0] = -at[1]*tanY;\n    m[2][1] = -at[0]*tanX;\n    return m;\n  }\n\n\n  /**\n   * Get a matrix to reflect a point along a line. For use in `transform2D`\n   * @param p1 first end point to define the reflection line\n   * @param p1 second end point to define the reflection line\n   */\n  static reflectAt2DMatrix( p1:PtLike, p2:PtLike ) {\n    let intercept = Line.intercept( p1, p2 );\n    \n    if (intercept == undefined) {\n      return [\n        new Pt( [-1, 0, 0] ),\n        new Pt( [0, 1, 0] ),\n        new Pt( [p1[0]+p2[0], 0, 1] )  \n      ];\n    } else {\n\n      let yi = intercept.yi;\n      let ang2 = Math.atan( intercept.slope ) * 2;\n      let cosA = Math.cos( ang2 );\n      let sinA = Math.sin( ang2 );\n      \n      return [\n        new Pt( [cosA, sinA, 0] ),\n        new Pt( [sinA, -cosA, 0] ),\n        new Pt( [-yi*sinA, yi + yi*cosA, 1] )\n      ];\n    }\n  }\n\n  \n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/LinearAlgebra.ts","// Source code licensed under Apache License 2.0. \r\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\r\n\r\n\r\nimport {Pt, IPt, Group, GroupLike} from \"./Pt\";\r\n\r\n/**\r\n * Bound is a subclass of Group that represents a rectangular boundary.\r\n * It includes some convenient properties such as `x`, `y`, bottomRight`, `center`, and `size`. \r\n */\r\nexport class Bound extends Group implements IPt {\r\n\r\n  protected _center:Pt = new Pt();\r\n  protected _size:Pt = new Pt();\r\n  protected _topLeft:Pt = new Pt();\r\n  protected _bottomRight:Pt = new Pt();\r\n  protected _inited = false;\r\n\r\n  \r\n  /**\r\n   * Create a Bound. This is similar to the Group constructor.\r\n   * @param args a list of Pt as parameters\r\n   */\r\n  constructor( ...args:Pt[] ) {\r\n    super(...args);\r\n    this.init();\r\n  }\r\n\r\n\r\n  /**\r\n   * Create a Bound from a [ClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect) object.\r\n   * @param rect an object has top/left/bottom/right/width/height properties\r\n   * @returns a Bound object\r\n   */\r\n  static fromBoundingRect( rect:ClientRect ):Bound {\r\n    let b = new Bound( new Pt( rect.left||0, rect.top||0 ), new Pt( rect.right||0, rect.bottom||0 ) );\r\n    if (rect.width && rect.height) b.size = new Pt(rect.width, rect.height);\r\n    return b;\r\n  }\r\n\r\n  static fromGroup( g:GroupLike ):Bound {\r\n    if (g.length < 2) throw new Error( \"Cannot create a Bound from a group that has less than 2 Pt\" );\r\n    return new Bound( g[0], g[g.length-1] );\r\n  }\r\n\r\n\r\n  /**\r\n   * Initiate the bound's properties.\r\n   */\r\n  protected init() {\r\n    if (this.p1) {\r\n      this._size = this.p1.clone();\r\n      this._inited = true;\r\n    } \r\n    if (this.p1 && this.p2) {\r\n      let a = this.p1;\r\n      let b = this.p2;\r\n      this.topLeft = a.$min(b);\r\n      this._bottomRight = a.$max(b);\r\n      this._updateSize();\r\n      this._inited = true;\r\n    }\r\n  }\r\n\r\n\r\n  /**\r\n   * Clone this bound and return a new one\r\n   */\r\n  clone():Bound {\r\n    return new Bound( this._topLeft.clone(), this._bottomRight.clone() );\r\n  }\r\n\r\n  \r\n  /**\r\n   * Recalculte size and center\r\n   */\r\n  protected _updateSize() {\r\n    this._size = this._bottomRight.$subtract( this._topLeft ).abs();\r\n    this._updateCenter();\r\n  }\r\n\r\n\r\n  /**\r\n   * Recalculate center\r\n   */\r\n  protected _updateCenter() {\r\n    this._center = this._size.$multiply(0.5).add( this._topLeft );\r\n  }\r\n\r\n\r\n  /**\r\n   * Recalculate based on top-left position and size\r\n   */\r\n  protected _updatePosFromTop() {\r\n    this._bottomRight = this._topLeft.$add( this._size );\r\n    this._updateCenter();\r\n  }\r\n\r\n\r\n  /**\r\n   * Recalculate based on bottom-right position and size\r\n   */\r\n  protected _updatePosFromBottom() {\r\n    this._topLeft = this._bottomRight.$subtract( this._size );\r\n    this._updateCenter();\r\n  }\r\n\r\n\r\n  /**\r\n   * Recalculate based on center position and size\r\n   */\r\n  protected _updatePosFromCenter() {\r\n    let half = this._size.$multiply(0.5);\r\n    this._topLeft = this._center.$subtract( half );\r\n    this._bottomRight = this._center.$add( half );\r\n  }\r\n\r\n\r\n  get size():Pt { return new Pt(this._size); }\r\n  set size(p: Pt) { \r\n    this._size = new Pt(p); \r\n    this._updatePosFromTop();\r\n  }\r\n  \r\n\r\n  get center():Pt { return new Pt(this._center); }\r\n  set center( p:Pt ) {\r\n    this._center = new Pt(p);\r\n    this._updatePosFromCenter();\r\n  }\r\n\r\n\r\n  get topLeft():Pt { return new Pt(this._topLeft); }\r\n  set topLeft( p:Pt ) {\r\n    this._topLeft = new Pt(p);\r\n    this[0] = this._topLeft;\r\n    this._updateSize();\r\n  }\r\n\r\n\r\n  get bottomRight():Pt { return new Pt(this._bottomRight); }\r\n  set bottomRight( p:Pt ) {\r\n    this._bottomRight = new Pt(p);\r\n    this[1] = this._bottomRight;\r\n    this._updateSize();\r\n  }\r\n\r\n\r\n  get width():number { return (this._size.length > 0) ? this._size.x : 0; }\r\n  set width( w:number ) {\r\n    this._size.x = w;\r\n    this._updatePosFromTop();\r\n  }\r\n\r\n\r\n  get height():number { return (this._size.length > 1) ? this._size.y : 0; }\r\n  set height( h:number ) {\r\n    this._size.y = h;\r\n    this._updatePosFromTop();\r\n  }\r\n\r\n\r\n  get depth():number { return (this._size.length > 2) ? this._size.z : 0; }\r\n  set depth( d:number ) {\r\n    this._size.z = d;\r\n    this._updatePosFromTop();\r\n  }\r\n  \r\n\r\n  get x():number { return this.topLeft.x; }\r\n  get y():number { return this.topLeft.y; }\r\n  get z():number { return this.topLeft.z; }\r\n\r\n\r\n  get inited():boolean { return this._inited; }\r\n\r\n  /**\r\n   * If the Group elements are changed, call this function to update the Bound's properties.\r\n   * It's preferable to change the topLeft/bottomRight etc properties instead of changing the Group array directly.\r\n   */\r\n  update() {\r\n    this._topLeft = this[0];\r\n    this._bottomRight = this[1];\r\n    this._updateSize();\r\n    return this;\r\n  }\r\n\r\n\r\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Bound.ts","// Source code licensed under Apache License 2.0. \r\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\r\n\r\n\r\nimport {Pt, PtLike, GroupLike} from \"./Pt\";\r\nimport {Util} from \"./Util\";\r\n\r\n\r\n/**\r\n* Form is an abstract class that represents a form that's used in a Space for expressions.\r\n*/\r\nexport abstract class Form {\r\n  \r\n  protected _ready:boolean = false;\r\n  \r\n  /**\r\n  * get whether the Form has received the Space's rendering context\r\n  */\r\n  get ready():boolean { return this._ready; }\r\n\r\n\r\n  /**\r\n   * Check number of items in a Group against a required number\r\n   * @param pts \r\n   */\r\n  static _checkSize( pts:GroupLike|number[][], required:number=2 ):boolean {\r\n    if (pts.length < required) {\r\n      Util.warn( \"Requires 2 or more Pts in this Group.\" );\r\n      return false;\r\n    } \r\n    return true;\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\n/**\r\n* VisualForm is an abstract class that represents a form that can be used to express Pts visually.\r\n* For example, CanvasForm is an implementation of VisualForm that draws on CanvasSpace which represents a html canvas.\r\n*/\r\nexport abstract class VisualForm extends Form {\r\n  \r\n  \r\n  protected _filled = true;\r\n  get filled():boolean { return this._filled; }\r\n  set filled( b:boolean ) { this._filled = b; }\r\n  \r\n  protected _stroked = true;\r\n  get stroked():boolean { return this._stroked; }\r\n  set stroked( b:boolean ) { this._stroked = b; }\r\n  \r\n  protected _font:Font = new Font( 14, \"sans-serif\");\r\n  get currentFont():Font { return this._font; }\r\n  \r\n  \r\n  protected _multiple( groups:GroupLike[], shape:string, ...rest ):this {\r\n    if (!groups) return this;\r\n    for (let i=0, len=groups.length; i<len; i++) {\r\n      this[shape]( groups[i], ...rest );\r\n    }\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Abstract reset style\r\n  */\r\n  abstract reset(): this;\r\n  \r\n  \r\n  /**\r\n  * Set fill color (not implemented)\r\n  */\r\n  fill( c:string|boolean ):this {\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Set current fill style and without stroke.\r\n  * @example `form.fillOnly(\"#F90\")`, `form.fillOnly(\"rgba(0,0,0,.5\")`\r\n  * @param c fill color which can be as color, gradient, or pattern. (See [canvas documentation](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle))\r\n  */\r\n  fillOnly( c:string|boolean ):this {\r\n    this.stroke( false );\r\n    return this.fill( c );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Set stroke style (not implemented)\r\n  */\r\n  stroke( c:string|boolean, width?:number, linejoin?:string, linecap?:string ):this {\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Set current stroke style and without fill.\r\n  * @example `form.strokeOnly(\"#F90\")`, `form.strokeOnly(\"#000\", 0.5, 'round', 'square')`\r\n  * @param c stroke color which can be as color, gradient, or pattern. (See [canvas documentation](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle)\r\n  */\r\n  strokeOnly( c:string|boolean, width?:number, linejoin?:string, linecap?:string ):this {\r\n    this.fill( false );\r\n    return this.stroke( c, width, linejoin, linecap );\r\n  }\r\n  \r\n  /**\r\n  * Abstract point drawing\r\n  * @param p a Pt object\r\n  * @param radius radius of the point. Default is 5.\r\n  * @param shape The shape of the point. Defaults to \"square\", but it can be \"circle\" or a custom shape function in your own implementation.\r\n  * @example `form.point( p )`, `form.point( p, 10, \"circle\" )`\r\n  */\r\n  abstract point( p:PtLike, radius:number, shape:string ):this;\r\n  \r\n  \r\n  /**\r\n  * Draw multiple points at once\r\n  * @param pts an array of Pt or an array of number arrays\r\n  * @param radius radius of the point. Default is 5.\r\n  * @param shape The shape of the point. Defaults to \"square\", but it can be \"circle\" or a custom shape function in your own implementation.\r\n  */\r\n  points( pts:GroupLike|number[][], radius:number, shape:string ): this {\r\n    if (!pts) return;\r\n    for (let i=0, len=pts.length; i<len; i++) {\r\n      this.point( pts[i], radius, shape );\r\n    }\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Abstract circle drawing\r\n  * @param pts usually a Group of 2 Pts, but it can also take an array of two numeric arrays [ [position], [size] ]\r\n  * @see [`Circle.fromCenter`](./_op_.circle.html#frompt)\r\n  */\r\n  abstract circle( pts:GroupLike|number[][] ):this;\r\n  \r\n  \r\n  \r\n  /**\r\n  * Draw multiple circles at once\r\n  * @param groups an array of Groups that defines multiple circles\r\n  */\r\n  circles( groups:GroupLike[] ):this {\r\n    return this._multiple( groups, \"circle\" );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Draw multiple squares at once\r\n  * @param groups an array of Groups that defines multiple circles\r\n  */\r\n  squares( groups:GroupLike[] ):this {\r\n    return this._multiple( groups, \"square\" );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Abstract arc drawing\r\n  * @param pt center position\r\n  * @param radius radius of the arc circle\r\n  * @param startAngle start angle of the arc\r\n  * @param endAngle end angle of the arc\r\n  * @param cc an optional boolean value to specify if it should be drawn clockwise (`false`) or counter-clockwise (`true`). Default is clockwise.\r\n  */\r\n  abstract arc( pt:PtLike, radius:number, startAngle:number, endAngle:number, cc?:boolean ):this;\r\n  \r\n  \r\n  /**\r\n  * Abstract a line or polyline drawing\r\n  * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\r\n  */\r\n  abstract line( pts:GroupLike|number[][] ):this;\r\n  \r\n  \r\n  /**\r\n  * Draw multiple lines at once\r\n  * @param groups An array of Groups of Pts\r\n  */\r\n  lines( groups:GroupLike[] ):this {\r\n    return this._multiple( groups, \"line\" );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Abstract polygon drawing\r\n  * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\r\n  */\r\n  abstract polygon( pts:GroupLike|number[][] ):this;\r\n  \r\n  \r\n  /**\r\n  * Draw multiple polygons at once\r\n  * @param groups An array of Groups of Pts\r\n  */\r\n  polygons( groups:GroupLike[] ):this {\r\n    return this._multiple( groups, \"polygon\" );\r\n  }\r\n  \r\n  \r\n  \r\n  /**\r\n  * Abstract rectangle drawing\r\n  * @param pts usually a Group of 2 Pts specifying the top-left and bottom-right positions. Alternatively it can be an array of numeric arrays.\r\n  */\r\n  abstract rect( pts:number[][]|Pt[] ):this;\r\n  \r\n  \r\n  /**\r\n  * Draw multiple rectangles at once\r\n  * @param groups An array of Groups of Pts\r\n  */\r\n  rects( groups:GroupLike[] ):this {\r\n    return this._multiple( groups, \"rect\" );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Abstract text rendering\r\n  * @param `pt` a Pt or numeric array to specify the anchor point\r\n  * @param `txt` text\r\n  * @param `maxWidth` specify a maximum width per line\r\n  */\r\n  abstract text( pt:PtLike, txt:string, maxWidth?:number): this;\r\n  \r\n  \r\n  /**\r\n  * Abstract font setting\r\n  * @param sizeOrFont either a number to specify font-size, or a `Font` object to specify all font properties\r\n  * @param weight Optional font-weight string such as \"bold\"\r\n  * @param style Optional font-style string such as \"italic\"\r\n  * @param lineHeight Optional line-height number suchas 1.5\r\n  * @param family Optional font-family such as \"Helvetica, sans-serif\"\r\n  * @see `Font` class\r\n  * @example `form.font( myFont )`, `form.font(14, \"bold\")`\r\n  */\r\n  abstract font( sizeOrFont:number|Font, weight?:string, style?:string, lineHeight?:number, family?:string ):this;\r\n}\r\n\r\n\r\n\r\n/**\r\n* Font class lets you create a specific font style with properties for its size and style\r\n*/\r\nexport class Font {\r\n  public size:number;\r\n  public lineHeight:number;\r\n  public face:string;\r\n  public style:string;\r\n  public weight:string;\r\n  \r\n  /**\r\n  * Create a font style\r\n  * @param size font size. Defaults is 12px.\r\n  * @param face Optional font-family, use css-like string such as \"Helvetica\" or \"Helvetica, sans-serif\". Default is \"sans-serif\".\r\n  * @param weight Optional font weight such as \"bold\". Default is \"\" (none).\r\n  * @param style Optional font style such as \"italic\". Default is \"\" (none).\r\n  * @param lineHeight Optional line height. Default is 1.5.\r\n  * @example `new Font(12, \"Frutiger, sans-serif\", \"bold\", \"underline\", 1.5)`\r\n  */\r\n  constructor( size:number=12, face:string=\"sans-serif\", weight:string=\"\", style:string=\"\", lineHeight:number=1.5 ) {\r\n    this.size = size;\r\n    this.face = face;\r\n    this.style = style;\r\n    this.weight = weight;\r\n    this.lineHeight = lineHeight;\r\n  }\r\n  \r\n  /**\r\n  * Get a string representing the font style, in css-like string such as \"italic bold 12px/1.5 sans-serif\"\r\n  */\r\n  get value():string { return `${this.style} ${this.weight} ${this.size}px/${this.lineHeight} ${this.face}`; }\r\n  \r\n  \r\n  /**\r\n  * Get a string representing the font style, in css-like string such as \"italic bold 12px/1.5 sans-serif\"\r\n  */\r\n  toString():string { return this.value; }\r\n  \r\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Form.ts","// Source code licensed under Apache License 2.0. \r\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\r\n\r\n\r\nimport {Bound} from \"./Bound\";\r\nimport {Pt, IPt} from \"./Pt\";\r\nimport {Form} from \"./Form\";\r\nimport {UIPointerActions as UIA}  from \"./UI\";\r\n\r\nexport type AnimateFunction = ( time?:number, frameTime?:number, currentSpace?:any ) => void;\r\n\r\n\r\n/**\r\n* Interface of a \"player\" object that can be added into a Space\r\n*/\r\nexport interface IPlayer {\r\n  animateID?: string;\r\n  animate?:AnimateFunction;\r\n  resize?( size:IPt, evt?:Event ): undefined;\r\n  action?( type:string, px:number, py:number, evt:Event );\r\n  start?( bound:Bound, space:Space );\r\n}\r\n\r\nexport interface ISpacePlayers { \r\n  [key: string]: IPlayer;\r\n}\r\n\r\nexport interface ITimer {\r\n  prev: number;\r\n  diff: number;\r\n  end: number;\r\n}\r\n\r\n\r\n/**\r\n* Space is an abstract class that represents a general context for expressing Pts.\r\n* See [Space guide](../../guide/Space-0500.html) for details.\r\n*/\r\nexport abstract class Space {\r\n  \r\n  id: string = \"space\";\r\n  protected bound: Bound = new Bound();\r\n  \r\n  protected _time: ITimer = { prev: 0, diff: 0, end: -1 };\r\n  protected players:ISpacePlayers = {};\r\n  protected playerCount = 0;\r\n  protected _ctx:any;\r\n  \r\n  private _animID:number = -1;\r\n  \r\n  private _pause:boolean = false;\r\n  private _refresh:boolean = undefined;\r\n  private _renderFunc: (context:any, self:Space) => null;\r\n  \r\n  protected _pointer:Pt = new Pt();\r\n\r\n  protected _isReady = false;\r\n  protected _playing = false;\r\n  \r\n  \r\n  /**\r\n  * Set whether the rendering should be repainted on each frame\r\n  * @param b a boolean value to set whether to repaint each frame\r\n  */\r\n  refresh( b:boolean ):this {\r\n    this._refresh = b;\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Add an IPlayer to this space. An IPlayer can define the following callback functions:    \r\n  * - `animate( time, ftime, space )`\r\n  * - `start(bound, space)`   \r\n  * - `resize( size, event )`\r\n  * - `action( type, x, y, event )`  \r\n  * Subclasses of Space may define other callback functions.\r\n  * @param player an IPlayer object with animate function, or simply a function(time, ftime){}\r\n  */\r\n  add( p:IPlayer|AnimateFunction ):this {\r\n    let player:IPlayer = (typeof p == \"function\") ? { animate: p } : p;\r\n    \r\n    let k = this.playerCount++;\r\n    let pid = this.id + k;\r\n    \r\n    this.players[pid] = player;\r\n    player.animateID = pid;\r\n    if (player.resize && this.bound.inited) player.resize( this.bound ); \r\n    \r\n    // if _refresh is not set, set it to true\r\n    if (this._refresh === undefined) this._refresh = true;\r\n    \r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Remove a player from this Space\r\n  * @param player an IPlayer that has an `animateID` property\r\n  */\r\n  remove( player:IPlayer ):this {\r\n    delete this.players[ player.animateID ];\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Remove all players from this Space\r\n  */\r\n  removeAll():this {\r\n    this.players = {};\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Main play loop. This implements window.requestAnimationFrame and calls it recursively. \r\n  * Override this `play()` function to implemenet your own animation loop.\r\n  * @param time current time\r\n  */\r\n  play( time=0 ):this {\r\n    \r\n    this._animID = requestAnimationFrame( this.play.bind(this) );\r\n    if (this._pause) return this;\r\n    \r\n    this._time.diff = time - this._time.prev;\r\n    this._time.prev = time;\r\n    \r\n    try {\r\n      this.playItems( time );\r\n    } catch (err) {\r\n      cancelAnimationFrame( this._animID );\r\n      this._playing = false;\r\n      throw err;\r\n    }\r\n    \r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Replay the animation after `stop()`. This resets the end-time counter.\r\n  * You may also use `pause()` and `resume()` for temporary pause.\r\n  */\r\n  replay() {\r\n    this._time.end = -1;\r\n    this.play();\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Main animate function. This calls all the items to perform\r\n  * @param time current time\r\n  */\r\n  protected playItems( time: number ) {\r\n\r\n    this._playing = true;\r\n    \r\n    // clear before draw if refresh is true\r\n    if (this._refresh) this.clear();\r\n    \r\n    // animate all players\r\n    if (this._isReady) {\r\n      for (let k in this.players) {\r\n        if (this.players[k].animate) this.players[k].animate( time, this._time.diff, this );\r\n      }\r\n    }\r\n    \r\n    // stop if time ended\r\n    if (this._time.end >= 0 && time > this._time.end) {\r\n      cancelAnimationFrame( this._animID );\r\n      this._playing = false;\r\n    }\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Pause the animation\r\n  * @param toggle a boolean value to set if this function call should be a toggle (between pause and resume)\r\n  */\r\n  pause( toggle=false ):this {\r\n    this._pause = (toggle) ? !this._pause : true;\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Resume the pause animation\r\n  */\r\n  resume():this {\r\n    this._pause = false;\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Specify when the animation should stop: immediately, after a time period, or never stops.\r\n  * @param t a value in millisecond to specify a time period to play before stopping, or `-1` to play forever, or `0` to end immediately. Default is 0 which will stop the animation immediately.\r\n  */\r\n  stop( t=0 ):this {\r\n    this._time.end = t;\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Play animation loop, and then stop after `duration` time has passed.\r\n  * @param duration a value in millisecond to specify a time period to play before stopping, or `-1` to play forever\r\n  */\r\n  playOnce( duration=5000 ):this {\r\n    this.play();\r\n    this.stop( duration );\r\n    return this;\r\n  }\r\n  \r\n  /**\r\n  * Custom rendering\r\n  * @param context rendering context\r\n  */\r\n  protected render( context:any ):this {\r\n    if (this._renderFunc) this._renderFunc( context, this );\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Set a custom rendering `function(graphics_context, canvas_space)` if needed\r\n  */\r\n  set customRendering( f:(context:any, self:Space) => null ) { this._renderFunc = f; }\r\n  get customRendering():(context:any, self:Space) => null { return this._renderFunc; }\r\n  \r\n\r\n  /**\r\n   * Get a boolean to indicate whether the animation is playing\r\n   */\r\n  get isPlaying():boolean { return this._playing; }\r\n\r\n\r\n  /**\r\n  * Get this space's bounding box\r\n  */\r\n  get outerBound():Bound { return this.bound.clone(); }\r\n  \r\n  \r\n  /**\r\n  * The bounding box of the canvas\r\n  */\r\n  public get innerBound():Bound { return new Bound( Pt.make( this.size.length, 0 ), this.size.clone() ); }\r\n  \r\n  \r\n  /**\r\n  * Get the size of this bounding box as a Pt\r\n  */\r\n  get size():Pt { return this.bound.size.clone(); }\r\n  \r\n  \r\n  /**\r\n  * Get the size of this bounding box as a Pt\r\n  */\r\n  get center():Pt { return this.size.divide(2); }\r\n  \r\n  \r\n  /**\r\n  * Get width of canvas\r\n  */\r\n  get width():number { return this.bound.width; }\r\n  \r\n  \r\n  /**\r\n  * Get height of canvas\r\n  */\r\n  get height():number { return this.bound.height; }\r\n  \r\n  \r\n  /**\r\n  * Resize the space\r\n  * @param w `width or an IPt object\r\n  * @param h height\r\n  */\r\n  abstract resize( b:IPt, evt?:Event ):this;\r\n  \r\n  \r\n  /**\r\n  * clear all contents in the space\r\n  */\r\n  abstract clear( ):this;\r\n  \r\n  \r\n  /**\r\n  * Get a default form for drawing in this space\r\n  */\r\n  abstract getForm():Form;\r\n  \r\n}\r\n\r\nexport type TouchPointsKey = \"touches\" | \"changedTouches\" | \"targetTouches\";\r\n\r\nexport interface MultiTouchElement {\r\n  addEventListener( evt:any, callback:Function );\r\n  removeEventListener( evt:any, callback:Function );\r\n}\r\n\r\nexport abstract class MultiTouchSpace extends Space {\r\n  \r\n  // track mouse dragging\r\n  protected _pressed = false;\r\n  protected _dragged = false;\r\n  \r\n  protected _hasMouse = false;\r\n  protected _hasTouch = false;\r\n  \r\n  // accept subclasses that implements addEventListener, removeEventListener, dispatchEvent\r\n  protected _canvas:EventTarget;\r\n  \r\n  /**\r\n  * Get the mouse or touch pointer that stores the last action\r\n  */\r\n  public get pointer():Pt {\r\n    let p = this._pointer.clone();\r\n    p.id = this._pointer.id;\r\n    return p;\r\n  }\r\n  \r\n  /**\r\n  * Bind event listener in canvas element. You can also use `bindMouse` or `bindTouch` to bind mouse or touch events conveniently.\r\n  * @param evt an event string such as \"mousedown\"\r\n  * @param callback callback function for this event\r\n  */\r\n  bindCanvas(evt:string, callback:EventListener) {\r\n    this._canvas.addEventListener( evt, callback );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Unbind a callback from the event listener\r\n  * @param evt an event string such as \"mousedown\"\r\n  * @param callback callback function to unbind\r\n  */\r\n  unbindCanvas(evt:string, callback:EventListener) {\r\n    this._canvas.removeEventListener( evt, callback );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * A convenient method to bind (or unbind) all mouse events in canvas element. All \"players\" added to this space that implements an `action` callback property will receive mouse event callbacks. The types of mouse actions are defined by UIPointerActions constants: \"up\", \"down\", \"move\", \"drag\", \"drop\", \"over\", and \"out\". See `Space`'s `add()` function for more details.\r\n  * @param _bind a boolean value to bind mouse events if set to `true`. If `false`, all mouse events will be unbound. Default is true.\r\n  * @see Space`'s [`add`](./_space_.space.html#add) function\r\n  */\r\n  bindMouse( _bind:boolean=true ):this {\r\n    if ( _bind) {\r\n      this.bindCanvas( \"mousedown\", this._mouseDown.bind(this) );\r\n      this.bindCanvas( \"mouseup\", this._mouseUp.bind(this) );\r\n      this.bindCanvas( \"mouseover\", this._mouseOver.bind(this) );\r\n      this.bindCanvas( \"mouseout\", this._mouseOut.bind(this) );\r\n      this.bindCanvas( \"mousemove\", this._mouseMove.bind(this) );\r\n      this._hasMouse = true;\r\n    } else {\r\n      this.unbindCanvas( \"mousedown\", this._mouseDown.bind(this) );\r\n      this.unbindCanvas( \"mouseup\", this._mouseUp.bind(this) );\r\n      this.unbindCanvas( \"mouseover\", this._mouseOver.bind(this) );\r\n      this.unbindCanvas( \"mouseout\", this._mouseOut.bind(this) );\r\n      this.unbindCanvas( \"mousemove\", this._mouseMove.bind(this) );\r\n      this._hasMouse = false;\r\n    }\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * A convenient method to bind (or unbind) all touch events in canvas element. All \"players\" added to this space that implements an `action` callback property will receive mouse event callbacks. The types of mouse actions are: \"up\", \"down\", \"move\", \"drag\", \"drop\", \"over\", and \"out\". \r\n  * @param _bind a boolean value to bind touch events if set to `true`. If `false`, all mouse events will be unbound. Default is true.\r\n  * @see Space`'s [`add`](./_space_.space.html#add) function\r\n  */\r\n  bindTouch( _bind:boolean=true ):this {\r\n    if (_bind) {\r\n      this.bindCanvas( \"touchstart\", this._mouseDown.bind(this) );\r\n      this.bindCanvas( \"touchend\", this._mouseUp.bind(this) );\r\n      this.bindCanvas( \"touchmove\", this._touchMove.bind(this) );\r\n      this.bindCanvas( \"touchcancel\", this._mouseOut.bind(this) );\r\n      this._hasTouch = true;\r\n    } else {\r\n      this.unbindCanvas( \"touchstart\", this._mouseDown.bind(this) );\r\n      this.unbindCanvas( \"touchend\", this._mouseUp.bind(this) );\r\n      this.unbindCanvas( \"touchmove\", this._touchMove.bind(this) );\r\n      this.unbindCanvas( \"touchcancel\", this._mouseOut.bind(this) );\r\n      this._hasTouch = false;\r\n    }\r\n    return this;\r\n  }\r\n  \r\n  \r\n  \r\n  \r\n  /**\r\n  * A convenient method to convert the touch points in a touch event to an array of `Pt`.\r\n  * @param evt a touch event which contains touches, changedTouches, and targetTouches list\r\n  * @param which a string to select a touches list: \"touches\", \"changedTouches\", or \"targetTouches\". Default is \"touches\"\r\n  * @return an array of Pt, whose origin position (0,0) is offset to the top-left of this space\r\n  */\r\n  touchesToPoints( evt:TouchEvent, which:TouchPointsKey=\"touches\" ): Pt[] {\r\n    if (!evt || !evt[which]) return [];\r\n    let ts = [];\r\n    for (var i=0; i<evt[which].length; i++) {\r\n      let t = evt[which].item(i);\r\n      ts.push( new Pt( t.pageX - this.bound.topLeft.x, t.pageY - this.bound.topLeft.y ) );\r\n    }\r\n    return ts;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Go through all the `players` and call its `action` callback function\r\n  * @param type an UIPointerActions constant or string: \"up\", \"down\", \"move\", \"drag\", \"drop\", \"over\", and \"out\"\r\n  * @param evt mouse or touch event\r\n  */\r\n  protected _mouseAction( type:string, evt:MouseEvent|TouchEvent ) {\r\n    let px = 0, py = 0;\r\n    \r\n    if (evt instanceof MouseEvent) {\r\n      for (let k in this.players) {\r\n        if (this.players.hasOwnProperty(k)) {\r\n          let v = this.players[k];\r\n          px = evt.pageX - this.outerBound.x;\r\n          py = evt.pageY - this.outerBound.y;\r\n          if (v.action) v.action( type, px, py, evt );\r\n        }\r\n      }\r\n    } else {\r\n      for (let k in this.players) {\r\n        if (this.players.hasOwnProperty(k)) {\r\n          let v = this.players[k];\r\n          let c = evt.changedTouches && evt.changedTouches.length > 0;\r\n          let touch = evt.changedTouches.item(0);\r\n          px = (c) ? touch.pageX - this.outerBound.x : 0;\r\n          py = (c) ? touch.pageY - this.outerBound.y : 0;\r\n          if (v.action) v.action( type, px, py, evt );\r\n        }\r\n      }\r\n    }\r\n    if (type) {\r\n      this._pointer.to( px, py );\r\n      this._pointer.id = type;\r\n    }\r\n  }\r\n  \r\n  \r\n  /**\r\n  * MouseDown handler\r\n  * @param evt \r\n  */\r\n  protected _mouseDown( evt:MouseEvent|TouchEvent ) {\r\n    this._mouseAction( UIA.down, evt );\r\n    this._pressed = true;\r\n    return false;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * MouseUp handler\r\n  * @param evt \r\n  */\r\n  protected _mouseUp( evt:MouseEvent|TouchEvent ) {\r\n    this._mouseAction( UIA.up, evt );\r\n    if (this._dragged) this._mouseAction( UIA.down, evt );\r\n    this._pressed = false;\r\n    this._dragged = false;\r\n    return false;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * MouseMove handler\r\n  * @param evt \r\n  */\r\n  protected _mouseMove( evt:MouseEvent|TouchEvent ) {\r\n    this._mouseAction( UIA.move, evt );\r\n    if (this._pressed) {\r\n      this._dragged = true;\r\n      this._mouseAction( UIA.drag, evt );\r\n    }\r\n    return false;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * MouseOver handler\r\n  * @param evt \r\n  */\r\n  protected _mouseOver( evt:MouseEvent|TouchEvent ) {\r\n    this._mouseAction( UIA.over, evt );\r\n    return false;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * MouseOut handler\r\n  * @param evt \r\n  */\r\n  protected _mouseOut( evt:MouseEvent|TouchEvent ) {\r\n    this._mouseAction( UIA.out, evt );\r\n    if (this._dragged) this._mouseAction( UIA.drop, evt );\r\n    this._dragged = false;\r\n    return false;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * TouchMove handler\r\n  * @param evt \r\n  */\r\n  protected _touchMove( evt:TouchEvent) {\r\n    this._mouseMove(evt);\r\n    evt.preventDefault();\r\n    return false;\r\n  }\r\n  \r\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Space.ts","// Source code licensed under Apache License 2.0. \n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport {MultiTouchSpace, IPlayer} from './Space';\nimport {Form, VisualForm, Font} from \"./Form\";\nimport {Bound} from './Bound';\nimport {Util} from './Util';\nimport {Pt, PtLike, GroupLike} from './Pt';\n\n\n/**\n * A type that represents the current context for an DOMForm\n */\nexport type DOMFormContext = {\n  group:Element, groupID:string, groupCount:number,\n  currentID:string,\n  currentClass?:string,\n  style:object,\n  font:string, fontSize:number, fontFamily:string\n};\n\n\n/**\n * A Space for DOM elements\n */\nexport class DOMSpace extends MultiTouchSpace {\n  \n  protected _canvas:HTMLElement|SVGElement;\n  protected _container:Element;\n  \n  id: string = \"domspace\";\n  protected _autoResize = true;\n  protected _bgcolor = \"#e1e9f0\";\n  protected _css = {};\n  \n  \n  /**\n  * Create a DOMSpace which represents a Space for DOM elements\n  * @param elem Specify an element by its \"id\" attribute as string, or by the element object itself. Use css to customize its appearance if needed.\n  * @param callback an optional callback `function(boundingBox, spaceElement)` to be called when canvas is appended and ready. Alternatively, a \"ready\" event will also be fired from the element when it's appended, which can be traced with `spaceInstance.canvas.addEventListener(\"ready\")`\n  * @example `new DOMSpace( \"#myElementID\" )`\n  */\n  constructor( elem:string|Element, callback?:Function) {\n    super();\n    \n    var _selector:Element = null;\n    var _existed = false;\n    this.id = \"pts\";\n    \n    // check element or element id string\n    if ( elem instanceof Element ) {\n      _selector = elem;\n      this.id = \"pts_existing_space\";\n    } else {\n      _selector = document.querySelector( <string>elem );\n      _existed = true;\n      this.id = elem.substr(1);\n    }\n    \n    // if selector is not defined, create a canvas\n    if (!_selector) {      \n      this._container = DOMSpace.createElement( \"div\", \"pts_container\" );\n      this._canvas = DOMSpace.createElement( \"div\", \"pts_element\" ) as HTMLElement;\n      this._container.appendChild( this._canvas );\n      document.body.appendChild( this._container );\n      _existed = false;\n      \n    } else {\n      this._canvas = _selector as HTMLElement;\n      this._container = _selector.parentElement;\n    }\n    \n    // no mutation observer, so we set a timeout for ready event\n    setTimeout( this._ready.bind( this, callback ), 50 );\n\n  }\n  \n  \n  /**\n  * Helper function to create a DOM element\n  * @param elem element tag name\n  * @param id element id attribute\n  * @param appendTo Optional, if specified, the created element will be appended to this element\n  */\n  static createElement( elem:string=\"div\", id:string, appendTo?:Element ):Element {\n    let d = document.createElement( elem );\n    if (id) d.setAttribute( \"id\", id );\n    if (appendTo && appendTo.appendChild) appendTo.appendChild( d );\n    return d;\n    \n  }\n  \n  \n  /**\n  * Handle callbacks after element is mounted in DOM\n  * @param callback \n  */\n  private _ready( callback:Function ) {\n    if (!this._container) throw new Error(`Cannot initiate #${this.id} element`);\n    \n    this._isReady = true;\n    \n    this._resizeHandler( null );\n    this.clear( this._bgcolor );\n    this._canvas.dispatchEvent( new Event(\"ready\") );\n    \n    \n    for (let k in this.players) {\n      if (this.players.hasOwnProperty(k)) {\n        if (this.players[k].start) this.players[k].start( this.bound.clone(), this );\n      }\n    }\n    \n    this._pointer = this.center;\n\n    this.refresh(false); // No need to clear and redraw for every frame in DOM\n    \n    if (callback) callback( this.bound, this._canvas );\n  }\n  \n  \n  /**\n  * Set up various options for DOMSpace. The `opt` parameter is an object with the following fields. This is usually set during instantiation, eg `new DOMSpace(...).setup( { opt } )`\n  * @param opt an object with optional settings, as follows.\n  * @param opt.bgcolor a hex or rgba string to set initial background color of the canvas, or use `false` or \"transparent\" to set a transparent background. You may also change it later with `clear()`    \n  * @param opt.resize a boolean to set whether `<canvas>` size should auto resize to match its container's size. You can also set it manually with `autoSize()`    \n  * @example `space.setup({ bgcolor: \"#f00\", resize: true })`\n  */\n  setup( opt:{bgcolor?:string, resize?:boolean} ):this {\n    if (opt.bgcolor) {\n      this._bgcolor = opt.bgcolor;\n    }\n    \n    this.autoResize = (opt.resize != undefined) ? opt.resize : false;\n    \n    return this;\n  }\n  \n\n  /**\n   * Not implemented. See SVGSpace and HTMLSpace for implementation\n   */\n  getForm():Form {\n    return null;\n  }\n  \n  /**\n  * Set whether the canvas element should resize when its container is resized. \n  * @param auto a boolean value indicating if auto size is set\n  */\n  set autoResize( auto:boolean ) {\n    this._autoResize = auto;\n    if (auto) {\n      window.addEventListener( 'resize', this._resizeHandler.bind(this) );\n    } else {\n      delete this._css['width'];\n      delete this._css['height'];\n      window.removeEventListener( 'resize', this._resizeHandler.bind(this) );\n    }\n  }\n  get autoResize(): boolean { return this._autoResize; }\n  \n  \n  /**\n  * This overrides Space's `resize` function. It's used as a callback function for window's resize event and not usually called directly. You can keep track of resize events with `resize: (bound ,evt)` callback in your player objects (See `Space`'s `add()` function). \n  * @param b a Bound object to resize to\n  * @param evt Optionally pass a resize event\n  */\n  resize( b:Bound, evt?:Event):this {\n    \n    this.bound = b;\n    this.styles( {width: `${b.width}px`, height: `${b.height}px`}, true );\n\n    for (let k in this.players) {\n      if (this.players.hasOwnProperty(k)) {\n        let p = this.players[k];\n        if (p.resize) p.resize( this.bound, evt);\n      }\n    };\n    \n    return this;\n  }\n  \n  \n  /**\n  * Window resize handling\n  * @param evt \n  */\n  protected _resizeHandler( evt:Event ) {\n    \n    let b = Bound.fromBoundingRect( this._container.getBoundingClientRect() );\n\n    if (this._autoResize) {\n      this.styles( {width: \"100%\", height: \"100%\"}, true );\n    } else {\n      this.styles( {width: `${b.width}px`, height: `${b.height}px`}, true );\n    }\n\n    this.resize( b, evt );\n    \n  }\n  \n  \n  /**\n  * Get this DOM element\n  */\n  get element():Element {\n    return this._canvas;\n  }\n  \n  \n  /**\n  * Get the parent DOM element that contains this DOM element\n  */\n  get parent():Element {\n    return this._container;\n  }\n  \n  \n  /**\n  * A property to indicate if the Space is ready\n  */\n  get ready():boolean { return this._isReady; }\n  \n  \n  /**\n  * Clear the element's contents, and ptionally set a new backgrounc color. Overrides Space's `clear` function.\n  * @param bg Optionally specify a custom background color in hex or rgba string, or \"transparent\". If not defined, it will use its `bgcolor` property as background color to clear the canvas.\n  */\n  clear( bg?:string ):this {\n    if (bg) this.background = bg;\n    this._canvas.innerHTML = \"\";\n    return this;\n  } \n  \n  \n  /**\n  * Set a background color on the container element\n  @param bg background color as hex or rgba string\n  */\n  set background( bg:string ) {\n    this._bgcolor = bg;\n    (this._container as HTMLElement).style.backgroundColor = this._bgcolor;\n  }\n  get background():string { return this._bgcolor; }\n  \n  \n  /**\n  * Add or update a style definition, and optionally update that style in the Element\n  * @param key style name\n  * @param val style value\n  * @param update a boolean to update the element's style immediately if set to `true`. Default is `false`.\n  */\n  style( key:string, val:string, update:boolean=false ):this {\n    this._css[key] = val;\n    if (update) this._canvas.style[key] = val;\n    return this;\n  }\n  \n  \n  /**\n  * Add of update a list of style definitions, and optionally update those styles in the Element\n  * @param styles a key-value objects of style definitions \n  * @param update a boolean to update the element's style immediately if set to `true`. Default is `false`.\n  * @return this\n  */\n  styles( styles:object, update:boolean=false ):this {\n    for (let k in styles) {\n      if ( styles.hasOwnProperty(k) ) this.style( k, styles[k], update );\n    }\n    return this;\n  }\n  \n  \n  /**\n  * A static helper function to add or update Element attributes\n  * @param elem Element to update\n  * @param data an object with key-value pairs\n  * @returns this DOM element \n  */\n  static setAttr( elem:Element, data:object ):Element {\n    for (let k in data) {\n      if (data.hasOwnProperty(k)) {\n        elem.setAttribute( k, data[k] );\n      }\n    }\n    return elem;\n  }\n  \n  \n  /**\n  * A static helper function to compose an inline style string from a object of styles\n  * @param elem Element to update\n  * @param data an object with key-value pairs\n  * @exmaple DOMSpace.getInlineStyles( {width: \"100px\", \"font-size\": \"10px\"} ); // returns \"width: 100px; font-size: 10px\"\n  */\n  static getInlineStyles( data:object ):string {\n    let str = \"\";\n    for (let k in data) {\n      if (data.hasOwnProperty(k)) {\n        if (data[k]) str += `${k}: ${data[k]}; `;\n      }\n    }\n    return str;\n  }\n  \n}\n\n\n/**\n * HTMLSpace. Note that this is currently experimental and may change in future.\n */\nexport class HTMLSpace extends DOMSpace {\n\n  /**\n  * Get a new `HTMLForm` for drawing\n  * @see `HTMLForm`\n  */\n  getForm():Form {\n    return new HTMLForm( this );\n  }\n\n  /**\n   * A static function to add a DOM element inside a node. Usually you don't need to use this directly. See methods in `DOMForm` instead.\n   * @param parent the parent element, or `null` to use current `<svg>` as parent.\n   * @param name a string of element name,  such as `rect` or `circle`\n   * @param id id attribute of the new element\n   * @param autoClass add a class based on the id (from char 0 to index of \"-\"). Default is true.\n   */\n  static htmlElement( parent:Element, name:string, id?:string, autoClass:boolean=true ):HTMLElement {\n    \n    if (!parent || !parent.appendChild ) throw new Error( \"parent is not a valid DOM element\" );\n    \n    let elem = document.querySelector(`#${id}`);\n    if (!elem) {\n      elem = document.createElement( name );\n      elem.setAttribute( \"id\", id );\n      \n      if (autoClass) elem.setAttribute( \"class\",id.substring(0, id.indexOf(\"-\")) );\n      parent.appendChild( elem );\n    }\n    return elem as HTMLElement;\n  }\n\n\n  /**\n  * Remove an item from this Space\n  * @param item a player item with an auto-assigned `animateID` property\n  */\n  remove( player:IPlayer ):this {\n    let temp = this._container.querySelectorAll( \".\"+HTMLForm.scopeID( player ) );\n    \n    temp.forEach( (el:Element) => { \n      el.parentNode.removeChild( el );\n    });\n    \n    return super.remove( player );\n  }\n  \n  \n  /**\n   * Remove all items from this Space\n   */\n  removeAll():this {\n    this._container.innerHTML = \"\";\n    return super.removeAll();\n  }\n}\n\n\n/**\n * Form for HTMLSpace. Note that this is currently experimental and may change in future.\n */\nexport class HTMLForm extends VisualForm {\n\n  protected _ctx:DOMFormContext = {\n    group: null,\n    groupID: \"pts\",\n    groupCount: 0,\n    currentID: \"pts0\",\n    currentClass: \"\",\n    style: {\n      \"filled\": true,\n      \"stroked\": true,\n      \"background\": \"#f03\",\n      \"border-color\": \"#fff\",\n      \"color\": \"#000\",\n      \"border-width\": \"1px\",\n      \"border-radius\": \"0\",\n      \"border-style\": \"solid\",\n      \"position\": \"absolute\",\n      \"top\": 0,\n      \"left\": 0,\n      \"width\": 0,\n      \"height\": 0\n    },\n    font: \"11px sans-serif\",\n    fontSize: 11,\n    fontFamily: \"sans-serif\"\n  };\n\n  static groupID:number = 0;\n  static domID:number = 0;\n  \n  protected _space:HTMLSpace;\n  protected _ready:boolean = false;\n  \n  constructor( space:HTMLSpace ) {\n    super();\n    this._space = space;\n    \n    this._space.add( { start: () => {\n      this._ctx.group = this._space.element;\n      this._ctx.groupID = \"pts_dom_\"+(HTMLForm.groupID++);\n      this._ready = true;\n    }} );\n  }\n  \n  get space():HTMLSpace { return this._space; }\n\n\n  /**\n   * Update a style in _ctx context or throw an Erorr if the style doesn't exist\n   * @param k style key\n   * @param v  style value\n   * @param unit Optional unit like 'px' to append to value\n   */\n  protected styleTo( k, v, unit:string='' ) { \n    if (this._ctx.style[k] === undefined) throw new Error(`${k} style property doesn't exist`);\n    this._ctx.style[k] = `${v}${unit}`; \n  }\n\n\n  /**\n  * Set current fill style. Provide a valid color string or `false` to specify no fill color.\n  * @example `form.fill(\"#F90\")`, `form.fill(\"rgba(0,0,0,.5\")`, `form.fill(false)`\n  * @param c fill color\n  */\n  fill( c:string|boolean ):this {\n    if (typeof c == \"boolean\") {\n      this.styleTo( \"filled\", c );\n      if (!c) this.styleTo( \"background\", \"transparent\" );\n    } else {\n      this.styleTo( \"filled\", true );\n      this.styleTo( \"background\", c );\n    }\n    return this;\n  }\n\n  /**\n  * Set current stroke style. Provide a valid color string or `false` to specify no stroke color.\n  * @example `form.stroke(\"#F90\")`, `form.stroke(\"rgba(0,0,0,.5\")`, `form.stroke(false)`, `form.stroke(\"#000\", 0.5, 'round', 'square')`\n  * @param c stroke color which can be as color, gradient, or pattern. (See [canvas documentation](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle))\n  * @param width Optional value (can be floating point) to set line width\n  * @param linejoin not implemented in HTMLForm\n  * @param linecap not implemented in HTMLForm\n  */\n  stroke( c:string|boolean, width?:number, linejoin?:string, linecap?:string ):this {\n    if (typeof c == \"boolean\") {\n      this.styleTo( \"stroked\", c );\n      if (!c) this.styleTo(\"border-width\", 0);\n    } else {\n      this.styleTo( \"stroked\", true );\n      this.styleTo( \"border-color\", c );\n      this.styleTo( \"border-width\", (width || 1)+\"px\" );\n    }\n    return this;\n  }\n\n\n  /**\n  * Set current text color style. Provide a valid color string.\n  * @example `form.fill(\"#F90\")`, `form.fill(\"rgba(0,0,0,.5\")`, `form.fill(false)`\n  * @param c fill color\n  */\n  fillText( c:string ):this {\n    this.styleTo( \"color\", c );\n    return this;\n  }\n\n\n  /**\n   * Add custom class to the created element\n   * @param c custom class name or `false` to reset it\n   * @example `form.fill(\"#f00\").cls(\"myClass\").rects(r)` `form.cls(false).circles(c)`\n   */\n  cls( c:string|boolean ) {\n    if (typeof c == \"boolean\") {\n      this._ctx.currentClass = \"\";\n    } else {\n      this._ctx.currentClass = c;\n    }\n    return this;\n  }\n  \n\n  /**\n  * Set the current font \n  * @param sizeOrFont either a number to specify font-size, or a `Font` object to specify all font properties\n  * @param weight Optional font-weight string such as \"bold\"\n  * @param style Optional font-style string such as \"italic\"\n  * @param lineHeight Optional line-height number suchas 1.5\n  * @param family Optional font-family such as \"Helvetica, sans-serif\"\n  * @example `form.font( myFont )`, `form.font(14, \"bold\")`\n  */\n  font( sizeOrFont:number|Font, weight?:string, style?:string, lineHeight?:number, family?:string ):this {\n    if (typeof sizeOrFont == \"number\") {\n      \n      this._font.size = sizeOrFont;\n      if (family) this._font.face = family;\n      if (weight) this._font.weight = weight;\n      if (style) this._font.style = style;\n      if (lineHeight) this._font.lineHeight = lineHeight;\n      this._ctx.font = this._font.value;\n      \n    } else {\n      this._font = sizeOrFont;\n    }\n    return this;\n  }\n\n  /**\n  * Reset the context's common styles to this form's styles. This supports using multiple forms on the same canvas context.\n  */\n  reset():this {\n    this._ctx.style = {\n      \"filled\": true, \"stroked\": true,\n      \"background\": \"#f03\", \"border-color\": \"#fff\",\n      \"border-width\": \"1px\"\n    };\n\n    this._font = new Font( 14, \"sans-serif\");\n    this._ctx.font = this._font.value;\n\n    return this;\n  }\n\n  /**\n   * Set this form's group scope by an ID, and optionally define the group's parent element. A group scope keeps track of elements by their generated IDs, and updates their properties as needed. See also `scope()`.\n   * @param group_id a string to use as prefix for the group's id. For example, group_id \"hello\" will create elements with id like \"hello-1\", \"hello-2\", etc\n   * @param group Optional DOM element to define this group's parent element\n   * @returns this form's context\n   */\n  updateScope( group_id:string, group?:Element ):object {\n    this._ctx.group = group;\n    this._ctx.groupID = group_id;\n    this._ctx.groupCount = 0;\n    this.nextID();\n    return this._ctx;\n  }\n  \n\n  /**\n   * Set the current group scope to an item added into space, in order to keep track of any point, circle, etc created within it. The item must have an `animateID` property, so that elements created within the item will have generated IDs like \"item-{animateID}-{count}\".\n   * @param item a \"player\" item that's added to space (see `space.add(...)`) and has an `animateID` property\n   * @returns this form's context\n   */\n  scope( item:IPlayer ) {\n    if (!item || item.animateID == null ) throw new Error(\"item not defined or not yet added to Space\");\n    return this.updateScope( HTMLForm.scopeID( item ), this.space.element );\n  }\n  \n  \n  /**\n   * Get next available id in the current group\n   * @returns an id string\n   */\n  nextID():string {\n    this._ctx.groupCount++;\n    this._ctx.currentID = `${this._ctx.groupID}-${this._ctx.groupCount}`;\n    return this._ctx.currentID;\n  }\n  \n\n  /**\n   * A static function to generate an ID string based on a context object\n   * @param ctx a context object for an HTMLForm\n   */\n  static getID( ctx ):string {\n    return ctx.currentID || `p-${HTMLForm.domID++}`;\n  }\n\n\n  /**\n   * A static function to generate an ID string for a scope, based on a \"player\" item in the Space\n   * @param item a \"player\" item that's added to space (see `space.add(...)`) and has an `animateID` property\n   */\n  static scopeID( item:IPlayer ):string {\n    return `item-${item.animateID}`;\n  }\n  \n  \n  /**\n   * A static function to help adding style object to an element. This put all styles into `style` attribute instead of individual attributes, so that the styles can be parsed by Adobe Illustrator.\n   * @param elem A DOM element to add to\n   * @param styles an object of style properties\n   * @example `HTMLForm.style(elem, {fill: \"#f90\", stroke: false})`\n   * @returns DOM element \n   */\n  static style( elem:Element, styles:object):Element {\n    let st = [];\n\n    if ( !styles[\"filled\"] ) st.push( \"background: none\");\n    if ( !styles[\"stroked\"] ) st.push( \"border: none\");\n        \n    for (let k in styles) {\n      if ( styles.hasOwnProperty(k) && k != \"filled\" && k != \"stroked\" ) {\n        let v = styles[k];\n        if (v) {\n          if ( !styles[\"filled\"] && k.indexOf('background') === 0 ) {\n            continue;\n          } else if ( !styles[\"stroked\"] && k.indexOf('border-width') === 0 ) {\n            continue;\n          } else {\n            st.push( `${k}: ${v}` );\n          }\n        }\n      }\n    }\n    \n    return HTMLSpace.setAttr( elem, {style: st.join(\";\")} );\n  }\n\n    /**\n   * A helper function to set top, left, width, height of DOM element\n   * @param x left position\n   * @param y top position\n   * @param w width\n   * @param h height\n   */\n  static rectStyle( ctx:DOMFormContext, pt:PtLike, size:PtLike ):DOMFormContext {\n    ctx.style[\"left\"] = pt[0]+\"px\"; \n    ctx.style[\"top\"] = pt[1]+\"px\"; \n    ctx.style[\"width\"] = size[0]+\"px\"; \n    ctx.style[\"height\"] = size[1]+\"px\"; \n    return ctx;\n  }\n  \n  /**\n  * Draws a point\n  * @param ctx a context object of HTMLForm\n  * @param pt a Pt object or numeric array\n  * @param radius radius of the point. Default is 5.\n  * @param shape The shape of the point. Defaults to \"square\", but it can be \"circle\" or a custom shape function in your own implementation.\n  * @example `HTMLForm.point( p )`, `HTMLForm.point( p, 10, \"circle\" )`\n  */\n  static point( ctx:DOMFormContext, pt:PtLike, radius:number=5, shape:string=\"square\" ):Element {\n    if (shape === \"circle\") {\n      return HTMLForm.circle( ctx, pt, radius );\n    } else {\n      return HTMLForm.square( ctx, pt, radius );\n    }\n  }\n\n\n  /**\n  * Draws a point\n  * @param p a Pt object\n  * @param radius radius of the point. Default is 5.\n  * @param shape The shape of the point. Defaults to \"square\", but it can be \"circle\" or a custom shape function in your own implementation.\n  * @example `form.point( p )`, `form.point( p, 10, \"circle\" )`\n  */\n  point( pt:PtLike, radius:number=5, shape:string=\"square\" ):this {\n    this.nextID();\n    if (shape == \"circle\") this.styleTo(\"border-radius\", \"100%\");\n    HTMLForm.point( this._ctx, pt, radius, shape );\n    return this;\n  }\n\n  \n  /**\n  * A static function to draw a circle\n  * @param ctx a context object of HTMLForm\n  * @param pt center position of the circle\n  * @param radius radius of the circle\n  */\n  static circle( ctx:DOMFormContext, pt:PtLike, radius:number=10 ):Element {\n    let elem = HTMLSpace.htmlElement( ctx.group, \"div\", HTMLForm.getID(ctx) );\n    HTMLSpace.setAttr( elem, {class: `pts-form pts-circle ${ctx.currentClass}` });\n    HTMLForm.rectStyle( ctx, new Pt(pt).$subtract( radius ), new Pt(radius*2, radius*2) );\n    HTMLForm.style( elem, ctx.style );\n    return elem;\n  }  \n\n\n  /**\n  * Draw a circle\n  * @param pts usually a Group of 2 Pts, but it can also take an array of two numeric arrays [ [position], [size] ]\n  * @see [`Circle.fromCenter`](./_op_.circle.html#frompt)\n  */\n  circle( pts:GroupLike|number[][] ):this {\n    this.nextID();\n    this.styleTo(\"border-radius\", \"100%\");\n    HTMLForm.circle( this._ctx, pts[0], pts[1][0] );\n    return this;\n  }\n\n\n  /**\n  * A static function to draw a square \n  * @param ctx a context object of HTMLForm\n  * @param pt center position of the square\n  * @param halfsize half size of the square\n  */\n  static square( ctx:DOMFormContext, pt:PtLike, halfsize:number ) {\n    let elem = HTMLSpace.htmlElement( ctx.group, \"div\", HTMLForm.getID(ctx) );\n    HTMLSpace.setAttr( elem, {class: `pts-form pts-square ${ctx.currentClass}` });\n    HTMLForm.rectStyle( ctx, new Pt(pt).$subtract( halfsize ), new Pt(halfsize*2, halfsize*2) );\n    HTMLForm.style( elem, ctx.style );\n    return elem;\n  }\n  \n\n  /**\n   * Draw a square, given a center and its half-size\n   * @param pt center Pt\n   * @param halfsize half-size\n   */\n  square( pt:PtLike, halfsize:number ):this {\n    this.nextID();\n    HTMLForm.square( this._ctx, pt, halfsize );\n    return this;\n  } \n\n\n  /**\n  * A static function to draw a rectangle\n  * @param ctx a context object of HTMLForm\n  * @param pts usually a Group of 2 Pts specifying the top-left and bottom-right positions. Alternatively it can be an array of numeric arrays.\n  */\n  static rect( ctx:DOMFormContext, pts:GroupLike|number[][] ):Element {\n    if (!this._checkSize( pts)) return;\n\n    let elem = HTMLSpace.htmlElement( ctx.group, \"div\", HTMLForm.getID(ctx) );    \n    HTMLSpace.setAttr( elem, { class: `pts-form pts-rect ${ctx.currentClass}` });\n    HTMLForm.rectStyle( ctx, pts[0], pts[1] );\n    HTMLForm.style( elem, ctx.style );\n    return elem;\n  }\n\n\n  /**\n  * Draw a rectangle\n  * @param pts usually a Group of 2 Pts specifying the top-left and bottom-right positions. Alternatively it can be an array of numeric arrays.\n  */\n  rect( pts:number[][]|Pt[] ):this {\n    this.nextID();\n    this.styleTo( \"border-radius\", \"0\" );\n    HTMLForm.rect( this._ctx, pts );\n    return this;\n  }\n\n\n  /**\n  * A static function to draw text\n  * @param ctx a context object of HTMLForm\n  * @param `pt` a Point object to specify the anchor point\n  * @param `txt` a string of text to draw\n  * @param `maxWidth` specify a maximum width per line\n  */\n  static text( ctx:DOMFormContext, pt:PtLike, txt:string ):Element {\n    let elem = HTMLSpace.htmlElement( ctx.group, \"div\", HTMLForm.getID(ctx) );\n    \n    HTMLSpace.setAttr( elem, {\n      position: 'absolute',\n      class: `pts-form pts-text ${ctx.currentClass}`,\n      left: pt[0],\n      top: pt[1],\n    });\n    \n    elem.textContent = txt;\n    HTMLForm.style( elem, ctx.style );\n    \n    return elem;\n  }\n\n  /**\n  * Draw text on canvas\n  * @param `pt` a Pt or numeric array to specify the anchor point\n  * @param `txt` text\n  * @param `maxWidth` specify a maximum width per line\n  */\n  text( pt:PtLike, txt:string ): this {\n    this.nextID();\n    HTMLForm.text( this._ctx, pt, txt );\n    return this;\n  }\n  \n\n  /**\n  * A convenient way to draw some text on canvas for logging or debugging. It'll be draw on the top-left of the canvas as an overlay.\n  * @param txt text\n  */\n  log( txt ):this {\n    this.fill(\"#000\").stroke(\"#fff\", 0.5).text( [10,14], txt );   \n    return this;\n  }\n  \n\n  /**\n   * Arc is not implemented in HTMLForm\n   */\n  arc( pt:PtLike, radius:number, startAngle:number, endAngle:number, cc?:boolean ):this {\n    Util.warn( \"arc is not implemented in HTMLForm\" );\n    return this;\n  }\n\n\n  /**\n   * Line is not implemented in HTMLForm\n   */\n  line( pts:GroupLike|number[][] ):this {\n    Util.warn( \"line is not implemented in HTMLForm\" );\n    return this;\n  }\n\n\n  /**\n   * Polygon is not implemented in HTMLForm\n   * @param pts \n   */\n  polygon( pts:GroupLike|number[][] ):this {\n    Util.warn( \"polygon is not implemented in HTMLForm\" );\n    return this;\n  }\n}\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Dom.ts","// Source code licensed under Apache License 2.0.\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport {Pt, GroupLike} from \"./Pt\";\n\n/** Various functions to support typography */\nexport class Typography {\n\n  /**\n   * Create a heuristic text width estimate function. It will be less accurate but faster.\n   * @param fn a reference function that can measure text width accurately\n   * @param samples a list of string samples. Default is [\"M\", \"n\", \".\"]\n   * @param distribution a list of the samples' probability distribution. Default is [0.06, 0.8, 0.14].\n   * @return a function that can estimate text width\n   */\n  static textWidthEstimator(  fn:(string) => number, samples:string[] = [\"M\", \"n\", \".\"], distribution:number[] = [0.06, 0.8, 0.14] ):(string) => number {\n    let m = samples.map( fn );\n    let avg = new Pt(distribution).dot( m );\n    return (str:string) => str.length * avg;\n  }\n\n\n  /**\n   * Truncate text to fit width\n   * @param fn a function that can measure text width\n   * @param str text to truncate\n   * @param width width to fit\n   * @param tail text to indicate overflow such as \"...\". Default is empty \"\".\n   */\n  static truncate( fn:(string) => number, str:string, width:number, tail:string=\"\" ):[string, number] {\n    let trim = Math.floor( str.length * Math.min( 1, width / (fn(str)*1.1) ) );\n    if (trim < str.length) {\n      trim = Math.max( 0, trim - tail.length );\n      return [str.substr(0, trim) + tail, trim];\n    } else {\n      return [str, str.length];\n    }\n  }\n\n\n  /**\n   * Get a function to scale font size proportionally to text box size changes.\n   * @param box Initial box as a Group\n   * @param ratio font-size change ratio. Default is 1.\n   * @returns a function where input parameter is a new box, and returns the new font size value\n   */\n  static fontSizeToBox( box:GroupLike, ratio:number=1 ) {\n    let h = (box[1][1] - box[0][1]);\n    let f = ratio * h;\n    return function( b:GroupLike ) {\n      let nh = (b[1][1] - b[0][1]) / h;\n      return f * nh;\n    };\n  }\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Typography.ts","// Source code licensed under Apache License 2.0. \r\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\r\n\r\n\r\nimport {MultiTouchSpace} from './Space';\r\nimport {VisualForm, Font} from \"./Form\";\r\nimport {Bound} from './Bound';\r\nimport {Pt, PtLike, GroupLike, Group} from \"./Pt\";\r\nimport {Const} from \"./Util\";\r\nimport {Typography as Typo} from \"./Typography\";\r\nimport { Rectangle } from './Op';\r\n\r\n\r\nexport interface PtsCanvasRenderingContext2D extends CanvasRenderingContext2D {\r\n  webkitBackingStorePixelRatio?:number;\r\n  mozBackingStorePixelRatio?:number;\r\n  msBackingStorePixelRatio?:number;\r\n  oBackingStorePixelRatio?:number;\r\n  backingStorePixelRatio?:number;\r\n}\r\n\r\n\r\n/**\r\n* CanvasSpace is an implementation of the abstract class Space. It represents a space for HTML Canvas.\r\n* Learn more about the concept of Space in [this guide](..guide/Space-0500.html)\r\n*/\r\nexport class CanvasSpace extends MultiTouchSpace {\r\n  \r\n  protected _canvas:HTMLCanvasElement;\r\n  protected _container:Element;\r\n\r\n  protected _pixelScale = 1;\r\n  protected _autoResize = true;\r\n  protected _bgcolor = \"#e1e9f0\";\r\n  protected _ctx:PtsCanvasRenderingContext2D;\r\n  \r\n  protected _offscreen = false;\r\n  protected _offCanvas:HTMLCanvasElement;\r\n  protected _offCtx:PtsCanvasRenderingContext2D;\r\n\r\n  protected _initialResize = false;\r\n  \r\n\r\n  \r\n  /**\r\n  * Create a CanvasSpace which represents a HTML Canvas Space\r\n  * @param elem Specify an element by its \"id\" attribute as string, or by the element object itself. An element can be an existing `<canvas>`, or a `<div>` container in which a new `<canvas>` will be created. If left empty, a `<div id=\"pt_container\"><canvas id=\"pt\" /></div>` will be added to DOM. Use css to customize its appearance if needed.\r\n  * @param callback an optional callback `function(boundingBox, spaceElement)` to be called when canvas is appended and ready. Alternatively, a \"ready\" event will also be fired from the `<canvas>` element when it's appended, which can be traced with `spaceInstance.canvas.addEventListener(\"ready\")`\r\n  * @example `new CanvasSpace( \"#myElementID\" )`\r\n  */\r\n  constructor( elem:string|Element, callback?:Function) {\r\n    super();\r\n    \r\n    var _selector:Element = null;\r\n    var _existed = false;\r\n    this.id = \"pt\";\r\n    \r\n    // check element or element id string\r\n    if ( elem instanceof Element ) {\r\n      _selector = elem;\r\n      this.id = \"pts_existing_space\";\r\n    } else {;\r\n      _selector = document.querySelector( <string>elem );\r\n      _existed = true;\r\n      this.id = elem;\r\n    }\r\n    \r\n    // if selector is not defined, create a canvas\r\n    if (!_selector) {      \r\n      this._container = this._createElement( \"div\", this.id+\"_container\" );\r\n      this._canvas = this._createElement( \"canvas\", this.id ) as HTMLCanvasElement;\r\n      this._container.appendChild( this._canvas );\r\n      document.body.appendChild( this._container );\r\n      _existed = false;\r\n      \r\n      // if selector is element but not canvas, create a canvas inside it\r\n    } else if (_selector.nodeName.toLowerCase() != \"canvas\") {      \r\n      this._container = _selector;\r\n      this._canvas = this._createElement( \"canvas\", this.id+\"_canvas\" ) as HTMLCanvasElement;\r\n      this._container.appendChild( this._canvas );\r\n      this._initialResize = true;\r\n      \r\n      // if selector is an existing canvas\r\n    } else {\r\n      this._canvas = _selector as HTMLCanvasElement;\r\n      this._container = _selector.parentElement;\r\n      this._autoResize = false;\r\n    }\r\n    \r\n    // if size is known then set it immediately\r\n    // if (_existed) {\r\n    // let b = this._container.getBoundingClientRect();\r\n    // this.resize( Bound.fromBoundingRect(b) );\r\n    // }\r\n    \r\n    // no mutation observer, so we set a timeout for ready event\r\n    setTimeout( this._ready.bind( this, callback ), 100 );\r\n    \r\n    // store canvas 2d rendering context\r\n    this._ctx = this._canvas.getContext('2d');\r\n    \r\n  }\r\n  \r\n  \r\n  /**\r\n  * Helper function to create a DOM element\r\n  * @param elem element tag name\r\n  * @param id element id attribute\r\n  */\r\n  protected _createElement( elem=\"div\", id ) {\r\n    let d = document.createElement( elem );\r\n    d.setAttribute(\"id\", id);\r\n    return d;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Handle callbacks after element is mounted in DOM\r\n  * @param callback \r\n  */\r\n  private _ready( callback:Function ) {\r\n    if (!this._container) throw new Error(`Cannot initiate #${this.id} element`);\r\n    \r\n    this._isReady = true;\r\n    \r\n    this._resizeHandler( null );\r\n\r\n    this.clear( this._bgcolor );\r\n    this._canvas.dispatchEvent( new Event(\"ready\") );\r\n    \r\n    for (let k in this.players) {\r\n      if (this.players.hasOwnProperty(k)) {\r\n        if (this.players[k].start) this.players[k].start( this.bound.clone(), this );\r\n      }\r\n    }\r\n    \r\n    this._pointer = this.center;\r\n    this._initialResize = false; // unset\r\n    \r\n    if (callback) callback( this.bound, this._canvas );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Set up various options for CanvasSpace. The `opt` parameter is an object with the following fields. This is usually set during instantiation, eg `new CanvasSpace(...).setup( { opt } )`\r\n  * @param opt an object with optional settings, as follows.\r\n  * @param opt.bgcolor a hex or rgba string to set initial background color of the canvas, or use `false` or \"transparent\" to set a transparent background. You may also change it later with `clear()`    \r\n  * @param opt.resize a boolean to set whether `<canvas>` size should auto resize to match its container's size. You can also set it manually with `autoSize()`    \r\n  * @param opt.retina a boolean to set if device pixel scaling should be used. This may make drawings on retina displays look sharper but may reduce performance slightly. Default is `true`.    \r\n  * @param opt.offscreen a boolean to set if a duplicate canvas should be created for offscreen rendering. Default is `false`.    \r\n  * @example `space.setup({ bgcolor: \"#f00\", retina: true, resize: true })`\r\n  */\r\n  setup( opt:{bgcolor?:string, resize?:boolean, retina?:boolean, offscreen?:boolean} ):this {\r\n    if (opt.bgcolor) this._bgcolor = opt.bgcolor;\r\n    \r\n    this.autoResize = (opt.resize != undefined) ? opt.resize : false;\r\n    \r\n    if (opt.retina !== false) {\r\n      let r1 = window.devicePixelRatio || 1;\r\n      let r2 = this._ctx.webkitBackingStorePixelRatio || this._ctx.mozBackingStorePixelRatio || this._ctx.msBackingStorePixelRatio || this._ctx.oBackingStorePixelRatio || this._ctx.backingStorePixelRatio || 1;      \r\n      this._pixelScale = r1/r2;\r\n    }\r\n    \r\n    if (opt.offscreen) {\r\n      this._offscreen = true;\r\n      this._offCanvas = this._createElement( \"canvas\", this.id+\"_offscreen\" ) as HTMLCanvasElement;\r\n      this._offCtx = this._offCanvas.getContext('2d');\r\n    } else {\r\n      this._offscreen = false;\r\n    }\r\n    \r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Set whether the canvas element should resize when its container is resized. \r\n  * @param auto a boolean value indicating if auto size is set\r\n  */\r\n  set autoResize( auto ) {\r\n    this._autoResize = auto;\r\n    if (auto) {\r\n      window.addEventListener( 'resize', this._resizeHandler.bind(this) );\r\n    } else {\r\n      window.removeEventListener( 'resize', this._resizeHandler.bind(this) );\r\n    }\r\n  }\r\n  get autoResize(): boolean { return this._autoResize; }\r\n  \r\n  \r\n    /**\r\n  * This overrides Space's `resize` function. It's used as a callback function for window's resize event and not usually called directly. You can keep track of resize events with `resize: (bound ,evt)` callback in your player objects (See `Space`'s `add()` function). \r\n  * @param b a Bound object to resize to\r\n  * @param evt Optionally pass a resize event\r\n  */\r\n  resize( b:Bound, evt?:Event):this {\r\n    \r\n    this.bound = b;\r\n\r\n    this._canvas.width = this.bound.size.x * this._pixelScale;\r\n    this._canvas.height = this.bound.size.y * this._pixelScale;\r\n    this._canvas.style.width = Math.floor(this.bound.size.x) + \"px\";\r\n    this._canvas.style.height = Math.floor(this.bound.size.y) + \"px\";\r\n    \r\n    if (this._offscreen) {\r\n      this._offCanvas.width = this.bound.size.x * this._pixelScale;\r\n      this._offCanvas.height = this.bound.size.y * this._pixelScale;\r\n      // this._offCanvas.style.width = Math.floor(this.bound.size.x) + \"px\";\r\n      // this._offCanvas.style.height = Math.floor(this.bound.size.y) + \"px\";\r\n    }\r\n    \r\n    if (this._pixelScale != 1) {\r\n      this._ctx.scale( this._pixelScale, this._pixelScale );\r\n      this._ctx.translate( 0.5, 0.5);\r\n      \r\n      if (this._offscreen) {\r\n        this._offCtx.scale( this._pixelScale, this._pixelScale );\r\n        this._offCtx.translate( 0.5, 0.5);      \r\n      }\r\n    }\r\n    \r\n    for (let k in this.players) {\r\n      if (this.players.hasOwnProperty(k)) {\r\n        let p = this.players[k];\r\n        if (p.resize) p.resize( this.bound, evt);\r\n      }\r\n    };\r\n    \r\n    this.render( this._ctx );\r\n\r\n    // if it's a valid resize event and space is not playing, repaint the canvas once\r\n    if (evt && !this.isPlaying) this.playOnce( 0 ); \r\n    \r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Window resize handling\r\n  * @param evt \r\n  */\r\n  protected _resizeHandler( evt:Event ) {\r\n    let b = (this._autoResize || this._initialResize) ? this._container.getBoundingClientRect() : this._canvas.getBoundingClientRect();\r\n\r\n    if (b) {\r\n      let box = Bound.fromBoundingRect(b);\r\n      \r\n      // Need to compute offset from window scroll. See outerBound calculation in Space's _mouseAction \r\n      box.center = box.center.add( window.pageXOffset, window.pageYOffset ); \r\n      this.resize( box, evt );\r\n    }\r\n  }\r\n  \r\n\r\n  /**\r\n  * Set a background color for this canvas. Alternatively, you may use `clear()` function.\r\n  @param bg background color as hex or rgba string\r\n  */\r\n  set background( bg:string ) { this._bgcolor = bg; }\r\n  get background():string { return this._bgcolor; }\r\n\r\n  \r\n  /**\r\n  * `pixelScale` property returns a number that let you determine if the screen is \"retina\" (when value >= 2)\r\n  */\r\n  public get pixelScale():number {\r\n    return this._pixelScale;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Check if an offscreen canvas is created\r\n  */\r\n  public get hasOffscreen():boolean {\r\n    return this._offscreen;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Get the rendering context of offscreen canvas (if created via `setup()`)\r\n  */\r\n  public get offscreenCtx():PtsCanvasRenderingContext2D { return this._offCtx; }\r\n  \r\n  \r\n  /**\r\n  * Get the offscreen canvas element\r\n  */\r\n  public get offscreenCanvas():HTMLCanvasElement { return this._offCanvas; }\r\n  \r\n  \r\n\r\n  \r\n  /**\r\n  * Get a new `CanvasForm` for drawing\r\n  * @see `CanvasForm`\r\n  */\r\n  public getForm():CanvasForm { return new CanvasForm(this); }\r\n  \r\n  \r\n  /**\r\n  * Get the html canvas element\r\n  */\r\n  get element():HTMLCanvasElement {\r\n    return this._canvas;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Get the parent element that contains the canvas element\r\n  */\r\n  get parent():Element {\r\n    return this._container;\r\n  }\r\n\r\n\r\n  /**\r\n   * A property to indicate if the Space is ready\r\n   */\r\n  get ready():boolean { \r\n    return this._isReady; \r\n  }\r\n  \r\n  \r\n  /**\r\n  * Get the rendering context of canvas\r\n  */\r\n  public get ctx():PtsCanvasRenderingContext2D { return this._ctx; }\r\n  \r\n  \r\n  \r\n  /**\r\n  * Clear the canvas with its background color. Overrides Space's `clear` function.\r\n  * @param bg Optionally specify a custom background color in hex or rgba string, or \"transparent\". If not defined, it will use its `bgcolor` property as background color to clear the canvas.\r\n  */\r\n  clear( bg?:string ):this {\r\n    \r\n    if (bg) this._bgcolor = bg;\r\n    let lastColor = this._ctx.fillStyle;\r\n    \r\n    if (this._bgcolor && this._bgcolor != \"transparent\") {\r\n      this._ctx.fillStyle = this._bgcolor;\r\n      this._ctx.fillRect( -1, -1, this._canvas.width+1, this._canvas.height+1 );\r\n    } else {\r\n      this._ctx.clearRect( -1, -1, this._canvas.width+1, this._canvas.height+1 );\r\n    }\r\n    \r\n    this._ctx.fillStyle = lastColor;\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Similiar to `clear()` but clear the offscreen canvas instead\r\n  * @param bg Optionally specify a custom background color in hex or rgba string, or \"transparent\". If not defined, it will use its `bgcolor` property as background color to clear the canvas.\r\n  */\r\n  clearOffscreen( bg?:string ):this {\r\n    if (this._offscreen) {\r\n      if (bg) {\r\n        this._offCtx.fillStyle = bg;\r\n        this._offCtx.fillRect( -1, -1, this._canvas.width+1, this._canvas.height+1 );\r\n      } else {\r\n        this._offCtx.clearRect( -1, -1, this._offCanvas.width+1, this._offCanvas.height+1 );\r\n      }\r\n    }\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Main animation function. Call `Space.playItems`.\r\n  * @param time current time\r\n  */\r\n  protected playItems( time: number ) {\r\n    if (this._isReady) {\r\n      this._ctx.save();\r\n      if (this._offscreen) this._offCtx.save();\r\n      super.playItems( time );\r\n      this._ctx.restore();\r\n      if (this._offscreen) this._offCtx.restore();\r\n      this.render( this._ctx );\r\n    }\r\n  }\r\n  \r\n  \r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n* CanvasForm is an implementation of abstract class VisualForm. It provide methods to express Pts on CanvasSpace.   \r\n* You may extend CanvasForm to implement your own expressions for CanvasSpace.\r\n*/\r\nexport class CanvasForm extends VisualForm {\r\n  \r\n  protected _space:CanvasSpace;\r\n  protected _ctx:CanvasRenderingContext2D;  \r\n  protected _estimateTextWidth:(string) => number;\r\n\r\n  /** \r\n  * store common styles so that they can be restored to canvas context when using multiple forms. See `reset()`.\r\n  */\r\n  protected _style = {\r\n    fillStyle: \"#f03\", strokeStyle:\"#fff\", \r\n    lineWidth: 1, lineJoin: \"bevel\", lineCap: \"butt\",\r\n  };\r\n  \r\n  \r\n  /**\r\n  * Create a new CanvasForm. You may also use `space.getForm()` to get the default form.\r\n  * @param space an instance of CanvasSpace\r\n  */\r\n  constructor( space:CanvasSpace ) {\r\n    super();\r\n    this._space = space;\r\n    \r\n    this._space.add( { start: () => {\r\n      this._ctx = this._space.ctx;\r\n      this._ctx.fillStyle = this._style.fillStyle;\r\n      this._ctx.strokeStyle = this._style.strokeStyle;    \r\n      this._ctx.lineJoin = \"bevel\";\r\n      this._ctx.font = this._font.value;\r\n      this._ready = true;\r\n    }} );\r\n  }\r\n  \r\n  \r\n  /**\r\n  * get the CanvasSpace instance that this form is associated with\r\n  */\r\n  get space():CanvasSpace { return this._space; }\r\n  \r\n\r\n  /**\r\n  * Toggle whether to draw on offscreen canvas (if offscreen is set in CanvasSpace)\r\n  * @param off if `true`, draw on offscreen canvas instead of the visible canvas. Default is `true`\r\n  * @param clear optionally provide a valid color string to fill a bg color. see CanvasSpace's `clearOffscreen` function.\r\n  */\r\n  useOffscreen( off:boolean=true, clear:boolean|string=false ) {\r\n    if (clear) this._space.clearOffscreen( (typeof clear == \"string\") ? clear : null );\r\n    this._ctx = (this._space.hasOffscreen && off) ? this._space.offscreenCtx : this._space.ctx;\r\n    return this;\r\n  }\r\n  \r\n  \r\n  /**\r\n  * Render the offscreen canvas's content on the visible canvas\r\n  * @param offset Optional offset on the top-left position when drawing on the visible canvas\r\n  */\r\n  renderOffscreen( offset:PtLike=[0,0] ) {\r\n    if (this._space.hasOffscreen) {\r\n      this._space.ctx.drawImage( \r\n        this._space.offscreenCanvas, offset[0], offset[1], this._space.width, this._space.height );\r\n      }\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Set current fill style. Provide a valid color string or `false` to specify no fill color.\r\n    * @example `form.fill(\"#F90\")`, `form.fill(\"rgba(0,0,0,.5\")`, `form.fill(false)`\r\n    * @param c fill color which can be as color, gradient, or pattern. (See [canvas documentation](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle))\r\n    */\r\n    fill( c:string|boolean ):this {\r\n      if (typeof c == \"boolean\") {\r\n        this.filled = c;\r\n      } else {\r\n        this.filled = true;\r\n        this._style.fillStyle = c;\r\n        this._ctx.fillStyle = c;\r\n      }\r\n      return this;\r\n    }\r\n    \r\n    \r\n    \r\n    /**\r\n    * Set current stroke style. Provide a valid color string or `false` to specify no stroke color.\r\n    * @example `form.stroke(\"#F90\")`, `form.stroke(\"rgba(0,0,0,.5\")`, `form.stroke(false)`, `form.stroke(\"#000\", 0.5, 'round', 'square')`\r\n    * @param c stroke color which can be as color, gradient, or pattern. (See [canvas documentation](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle))\r\n    * @param width Optional value (can be floating point) to set line width\r\n    * @param linejoin Optional string to set line joint style. Can be \"miter\", \"bevel\", or \"round\".\r\n    * @param linecap Optional string to set line cap style. Can be \"butt\", \"round\", or \"square\".\r\n    */\r\n    stroke( c:string|boolean, width?:number, linejoin?:string, linecap?:string ):this {\r\n      if (typeof c == \"boolean\") {\r\n        this.stroked = c;\r\n      } else {\r\n        this.stroked = true;\r\n        this._style.strokeStyle = c;\r\n        this._ctx.strokeStyle = c;\r\n        if (width) {\r\n          this._ctx.lineWidth = width;\r\n          this._style.lineWidth = width;\r\n        }\r\n        if (linejoin) {\r\n          this._ctx.lineJoin = linejoin;\r\n          this._style.lineJoin = linejoin;\r\n        }\r\n        if (linecap) {\r\n          this._ctx.lineCap = linecap;\r\n          this._style.lineCap = linecap;\r\n        }\r\n      }\r\n      return this;\r\n    }\r\n    \r\n    \r\n    \r\n    /**\r\n    * Set the current font \r\n    * @param sizeOrFont either a number to specify font-size, or a `Font` object to specify all font properties\r\n    * @param weight Optional font-weight string such as \"bold\"\r\n    * @param style Optional font-style string such as \"italic\"\r\n    * @param lineHeight Optional line-height number suchas 1.5\r\n    * @param family Optional font-family such as \"Helvetica, sans-serif\"\r\n    * @example `form.font( myFont )`, `form.font(14, \"bold\")`\r\n    */\r\n    font( sizeOrFont:number|Font, weight?:string, style?:string, lineHeight?:number, family?:string ):this {\r\n      if (typeof sizeOrFont == \"number\") {\r\n        \r\n        this._font.size = sizeOrFont;\r\n        if (family) this._font.face = family;\r\n        if (weight) this._font.weight = weight;\r\n        if (style) this._font.style = style;\r\n        if (lineHeight) this._font.lineHeight = lineHeight;\r\n        this._ctx.font = this._font.value;\r\n        \r\n      } else {\r\n        this._font = sizeOrFont;\r\n      }\r\n\r\n      // If using estimate, reapply it when font changes.\r\n      if (this._estimateTextWidth) this.fontWidthEstimate( true );\r\n\r\n      return this;\r\n    }\r\n\r\n\r\n    /**\r\n     * Set whether to use ctx.measureText or a faster but less accurate heuristic function.\r\n     * @param estimate `true` to use heuristic function, or `false` to use ctx.measureText\r\n     */\r\n    fontWidthEstimate( estimate:boolean=true ):this {\r\n      this._estimateTextWidth = (estimate) ? Typo.textWidthEstimator( ((c:string) => this._ctx.measureText(c).width) ) : undefined;\r\n      return this;\r\n    }\r\n\r\n\r\n    /**\r\n     * Get the width of this text. It will return an actual measurement or an estimate based on `fontWidthEstimate` setting. Default is an actual measurement using canvas context's measureText.\r\n     * @param c a string of text contents\r\n     */\r\n    getTextWidth(c:string):number {\r\n      return (!this._estimateTextWidth) ? this._ctx.measureText(c).width : this._estimateTextWidth( c );\r\n    }\r\n\r\n\r\n    /**\r\n     * Truncate text to fit width\r\n     * @param str text to truncate\r\n     * @param width width to fit\r\n     * @param tail text to indicate overflow such as \"...\". Default is empty \"\".\r\n     */\r\n    protected _textTruncate( str:string, width:number, tail:string=\"\" ):[string, number] {\r\n      return Typo.truncate( this.getTextWidth.bind(this), str, width, tail );\r\n    }\r\n\r\n\r\n    /**\r\n     * Align text within a rectangle box\r\n     * @param box a Group that defines a rectangular box\r\n     * @param vertical a string that specifies the vertical alignment in the box: \"top\", \"bottom\", \"middle\", \"start\", \"end\"\r\n     * @param offset Optional offset from the edge (like padding)\r\n     * @param center Optional center position \r\n     */\r\n    protected _textAlign( box:GroupLike, vertical:string, offset?:PtLike, center?:Pt ):Pt {\r\n      if (!center) center = Rectangle.center( box );\r\n      var px = box[0][0];\r\n      if (this._ctx.textAlign == \"end\" || this._ctx.textAlign == \"right\") {\r\n        px = box[1][0];\r\n      } else if (this._ctx.textAlign == \"center\" || this._ctx.textAlign == \"middle\") {\r\n        px = center[0];\r\n      }\r\n\r\n      var py = center[1];\r\n      if (vertical == \"top\" || vertical == \"start\") {\r\n        py = box[0][1];\r\n      } else if (vertical == \"end\" || vertical == \"bottom\") {\r\n        py = box[1][1];\r\n      }\r\n\r\n      return (offset) ? new Pt( px+offset[0], py+offset[1] ) : new Pt(px, py);\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Reset the rendering context's common styles to this form's styles. This supports using multiple forms on the same canvas context.\r\n    */\r\n    reset():this {\r\n      for (let k in this._style) {\r\n        if (this._style.hasOwnProperty(k)) {\r\n          this._ctx[k] = this._style[k];\r\n        }\r\n      }\r\n      this._font = new Font();\r\n      this._ctx.font = this._font.value;\r\n      return this;\r\n    }\r\n    \r\n    \r\n    protected _paint() {\r\n      if (this._filled) this._ctx.fill();\r\n      if (this._stroked) this._ctx.stroke();\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Draws a point\r\n    * @param p a Pt object\r\n    * @param radius radius of the point. Default is 5.\r\n    * @param shape The shape of the point. Defaults to \"square\", but it can be \"circle\" or a custom shape function in your own implementation.\r\n    * @example `form.point( p )`, `form.point( p, 10, \"circle\" )`\r\n    */\r\n    point( p:PtLike, radius:number=5, shape:string=\"square\" ):this {\r\n      if (!p) return;\r\n      if (!CanvasForm[shape]) throw new Error(`${shape} is not a static function of CanvasForm`);\r\n      \r\n      CanvasForm[shape]( this._ctx, p, radius );\r\n      this._paint();\r\n      \r\n      return this;\r\n    }\r\n    \r\n    \r\n    /**\r\n    * A static function to draw a circle\r\n    * @param ctx canvas rendering context\r\n    * @param pt center position of the circle\r\n    * @param radius radius of the circle\r\n    */\r\n    static circle( ctx:CanvasRenderingContext2D, pt:PtLike, radius:number=10 ) {\r\n      if (!pt) return;\r\n      ctx.beginPath();\r\n      ctx.arc( pt[0], pt[1], radius, 0, Const.two_pi, false );\r\n      ctx.closePath();\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Draw a circle\r\n    * @param pts usually a Group of 2 Pts, but it can also take an array of two numeric arrays [ [position], [size] ]\r\n    * @see [`Circle.fromCenter`](./_op_.circle.html#frompt)\r\n    */\r\n    circle( pts:GroupLike|number[][] ):this {\r\n      CanvasForm.circle( this._ctx, pts[0], pts[1][0] );\r\n      this._paint();\r\n      return this;\r\n    }\r\n    \r\n    \r\n    /**\r\n    * A static function to draw an arc.\r\n    * @param ctx canvas rendering context\r\n    * @param pt center position \r\n    * @param radius radius of the arc circle\r\n    * @param startAngle start angle of the arc\r\n    * @param endAngle end angle of the arc\r\n    * @param cc an optional boolean value to specify if it should be drawn clockwise (`false`) or counter-clockwise (`true`). Default is clockwise.\r\n    */\r\n    static arc( ctx:CanvasRenderingContext2D, pt:PtLike, radius:number, startAngle:number, endAngle:number, cc?:boolean ) {\r\n      if (!pt) return;\r\n      ctx.beginPath();\r\n      ctx.arc( pt[0], pt[1], radius, startAngle, endAngle, cc );\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Draw an arc.\r\n    * @param pt center position\r\n    * @param radius radius of the arc circle\r\n    * @param startAngle start angle of the arc\r\n    * @param endAngle end angle of the arc\r\n    * @param cc an optional boolean value to specify if it should be drawn clockwise (`false`) or counter-clockwise (`true`). Default is clockwise.\r\n    */\r\n    arc( pt:PtLike, radius:number, startAngle:number, endAngle:number, cc?:boolean ):this {\r\n      CanvasForm.arc( this._ctx, pt, radius, startAngle, endAngle, cc );\r\n      this._paint();\r\n      return this;\r\n    }\r\n    \r\n    \r\n    /**\r\n    * A static function to draw a square \r\n    * @param ctx canvas rendering context\r\n    * @param pt center position of the square\r\n    * @param halfsize half size of the square\r\n    */\r\n    static square( ctx:CanvasRenderingContext2D, pt:PtLike, halfsize:number ) {\r\n      if (!pt) return;\r\n      let x1 = pt[0]-halfsize;\r\n      let y1 = pt[1]-halfsize;\r\n      let x2 = pt[0]+halfsize;\r\n      let y2 = pt[1]+halfsize;\r\n      \r\n      // faster than using `rect`\r\n      ctx.beginPath();\r\n      ctx.moveTo( x1, y1 );\r\n      ctx.lineTo( x1, y2 );\r\n      ctx.lineTo( x2, y2 );\r\n      ctx.lineTo( x2, y1 );\r\n      ctx.closePath();\r\n    }\r\n    \r\n    \r\n    /**\r\n     * Draw a square, given a center and its half-size\r\n     * @param pt center Pt\r\n     * @param halfsize half-size\r\n     */\r\n    square( pt:PtLike, halfsize:number ) {\r\n      CanvasForm.square( this._ctx, pt, halfsize );\r\n      this._paint();\r\n      return this;\r\n    }\r\n\r\n    \r\n    /**\r\n    * A static function to draw a line\r\n    * @param ctx canvas rendering context\r\n    * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\r\n    */\r\n    static line( ctx:CanvasRenderingContext2D, pts:GroupLike|number[][] ) {\r\n      if (pts.length<2) return;\r\n      ctx.beginPath();\r\n      ctx.moveTo( pts[0][0], pts[0][1] );\r\n      for (let i=1, len=pts.length; i<len; i++) {\r\n        if (pts[i]) ctx.lineTo( pts[i][0], pts[i][1] );\r\n      }\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Draw a line or polyline\r\n    * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\r\n    */\r\n    line( pts:GroupLike|number[][] ):this {\r\n      CanvasForm.line( this._ctx, pts );\r\n      this._paint();\r\n      return this;\r\n    }\r\n    \r\n    \r\n    /**\r\n    * A static function to draw polygon\r\n    * @param ctx canvas rendering context\r\n    * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\r\n    */\r\n    static polygon( ctx:CanvasRenderingContext2D, pts:GroupLike|number[][] ) {\r\n      if (pts.length<2) return;\r\n      ctx.beginPath();\r\n      ctx.moveTo( pts[0][0], pts[0][1] );\r\n      for (let i=1, len=pts.length; i<len; i++) {\r\n        if (pts[i]) ctx.lineTo( pts[i][0], pts[i][1] );\r\n      }\r\n      ctx.closePath();\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Draw a polygon\r\n    * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\r\n    */\r\n    polygon( pts:GroupLike|number[][] ):this {\r\n      CanvasForm.polygon( this._ctx, pts );\r\n      this._paint();\r\n      return this;\r\n    }\r\n    \r\n    \r\n    /**\r\n    * A static function to draw a rectangle\r\n    * @param ctx canvas rendering context\r\n    * @param pts usually a Group of 2 Pts specifying the top-left and bottom-right positions. Alternatively it can be an array of numeric arrays.\r\n    */\r\n    static rect( ctx:CanvasRenderingContext2D, pts:GroupLike|number[][] ) {\r\n      if (pts.length<2) return;\r\n      ctx.beginPath();\r\n      ctx.moveTo( pts[0][0], pts[0][1] );\r\n      ctx.lineTo( pts[0][0], pts[1][1] );\r\n      ctx.lineTo( pts[1][0], pts[1][1] );\r\n      ctx.lineTo( pts[1][0], pts[0][1] );\r\n      ctx.closePath();\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Draw a rectangle\r\n    * @param pts usually a Group of 2 Pts specifying the top-left and bottom-right positions. Alternatively it can be an array of numeric arrays.\r\n    */\r\n    rect( pts:number[][]|Pt[] ):this {\r\n      CanvasForm.rect( this._ctx, pts );\r\n      this._paint();\r\n      return this;\r\n    }\r\n    \r\n    \r\n    /**\r\n    * A static function to draw text\r\n    * @param ctx canvas rendering context\r\n    * @param `pt` a Point object to specify the anchor point\r\n    * @param `txt` a string of text to draw\r\n    * @param `maxWidth` specify a maximum width per line\r\n    */\r\n    static text( ctx:CanvasRenderingContext2D, pt:PtLike, txt:string, maxWidth?:number ) {\r\n      if (!pt) return;\r\n      ctx.fillText( txt, pt[0], pt[1], maxWidth );\r\n    }\r\n    \r\n    \r\n    /**\r\n    * Draw text on canvas\r\n    * @param `pt` a Pt or numeric array to specify the anchor point\r\n    * @param `txt` text\r\n    * @param `maxWidth` specify a maximum width per line\r\n    */\r\n    text( pt:PtLike, txt:string, maxWidth?:number): this {\r\n      CanvasForm.text( this._ctx, pt, txt, maxWidth );\r\n      return this;\r\n    }\r\n    \r\n\r\n    /**\r\n     * Fit a single-line text in a rectangular box\r\n     * @param box a rectangle box defined by a Group\r\n     * @param txt string of text\r\n     * @param tail text to indicate overflow such as \"...\". Default is empty \"\".\r\n     * @param verticalAlign \"top\", \"middle\", or \"bottom\" to specify vertical alignment inside the box\r\n     * @param overrideBaseline If `true`, use the corresponding baseline as verticalAlign. If `false`, use the current canvas context's textBaseline setting. Default is `true`.\r\n     */\r\n    textBox( box:GroupLike, txt:string, verticalAlign:string=\"middle\", tail:string=\"\", overrideBaseline:boolean=true): this {\r\n      if (overrideBaseline) this._ctx.textBaseline = verticalAlign;\r\n      let size = Rectangle.size( box );\r\n      let t = this._textTruncate( txt, size[0], tail );\r\n      this.text( this._textAlign( box, verticalAlign ), t[0] );\r\n      return this;\r\n    }\r\n\r\n\r\n    /**\r\n     * Fit multi-line text in a rectangular box. Note that this will also set canvas context's textBaseline to \"top\".\r\n     * @param box a rectangle box defined by a Group\r\n     * @param txt string of text\r\n     * @param lineHeight line height as a ratio of font size. Default is 1.2.\r\n     * @param verticalAlign \"top\", \"middle\", or \"bottom\" to specify vertical alignment inside the box\r\n     * @param crop a boolean to specify whether to crop text when overflowing\r\n     */\r\n    paragraphBox( box:GroupLike, txt:string, lineHeight:number=1.2, verticalAlign:string=\"top\", crop:boolean=true ):this {\r\n      let size = Rectangle.size( box );\r\n      this._ctx.textBaseline = \"top\"; // override textBaseline\r\n      \r\n      let lstep = this._font.size * lineHeight;\r\n\r\n      // find next lines recursively\r\n      let nextLine = (sub:string, buffer:string[]=[], cc:number=0 ) => {\r\n        if (!sub) return buffer;\r\n        if (crop && cc*lstep > size[1]-lstep*2) return buffer;\r\n        if (cc>10000) throw new Error(\"max recursion reached (10000)\");\r\n\r\n        let t = this._textTruncate( sub, size[0], \"\" );\r\n\r\n        // new line\r\n        let newln = t[0].indexOf(\"\\n\");\r\n        if (newln >= 0) {\r\n          buffer.push( t[0].substr(0, newln) );\r\n          return nextLine( sub.substr( newln+1 ), buffer, cc+1 ); \r\n        }\r\n\r\n        // word wrap\r\n        let dt = t[0].lastIndexOf( \" \" ) + 1;\r\n        if ( dt <= 0 || t[1] === sub.length ) dt = undefined;\r\n        let line = t[0].substr(0, dt );\r\n        buffer.push( line );\r\n\r\n        return (t[1] <= 0 || t[1] === sub.length) ? buffer : nextLine( sub.substr( (dt || t[1]) ), buffer, cc+1 );\r\n      };\r\n\r\n      let lines = nextLine( txt ); // go through all lines\r\n      let lsize = lines.length * lstep; // total height\r\n      let lbox = box;\r\n      \r\n\r\n      if (verticalAlign == \"middle\" || verticalAlign == \"center\") {\r\n        let lpad = (size[1] - lsize) / 2; \r\n        if (crop) lpad = Math.max( 0, lpad );  \r\n        lbox = new Group( box[0].$add(0, lpad), box[1].$subtract(0, lpad) );\r\n      } else if (verticalAlign == \"bottom\") {\r\n        lbox = new Group( box[0].$add( 0, size[1]-lsize ), box[1] );\r\n      } else {\r\n        lbox = new Group( box[0], box[0].$add(size[0], lsize) );\r\n      }\r\n\r\n      let center = Rectangle.center( lbox );\r\n      for (let i=0, len=lines.length; i<len; i++) {\r\n        this.text( this._textAlign( lbox, \"top\", [0, i*lstep], center ), lines[i] );\r\n      }\r\n\r\n      return this;\r\n    }\r\n\r\n\r\n    /**\r\n     * Set text alignment and baseline (eg, vertical-align)\r\n     * @param alignment Canvas' textAlign option: \"left\", \"right\", \"center\", \"start\", or \"end\"\r\n     * @param baseline Canvas' textBaseline option: \"top\", \"hanging\", \"middle\", \"alphabetic\", \"ideographic\", \"bottom\". For convenience, you can also use \"center\" (same as \"middle\"), and \"baseline\" (same as \"alphabetic\")\r\n     */\r\n    alignText( alignment:string=\"left\", baseline:string=\"alphabetic\") {\r\n      if (baseline == \"center\") baseline = \"middle\";\r\n      if (baseline == \"baseline\") baseline = \"alphabetic\";\r\n      this._ctx.textAlign = alignment;\r\n      this._ctx.textBaseline = baseline;\r\n      return this;\r\n    }\r\n\r\n    \r\n    /**\r\n    * A convenient way to draw some text on canvas for logging or debugging. It'll be draw on the top-left of the canvas as an overlay.\r\n    * @param txt text\r\n    */\r\n    log( txt ):this {\r\n      let w = this._ctx.measureText( txt ).width + 20;\r\n      this.stroke(false).fill(\"rgba(0,0,0,.4)\").rect( [[0,0], [w, 20]] );\r\n      this.fill(\"#fff\").text( [10,14], txt );   \r\n      return this;\r\n    }\r\n    \r\n  }\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Canvas.ts","// Source code licensed under Apache License 2.0. \n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport {Pt, Group, PtLike} from \"./Pt\";\nimport {Util} from \"./Util\";\nimport {Num, Geom} from \"./Num\";\n\nexport type ColorType = \"rgb\"|\"hsl\"|\"hsb\"|\"lab\"|\"lch\"|\"luv\"|\"xyz\";\n\n\n/**\n * Color is a subclass of Pt. You can think of a color as a point in a color space. The Color class provides support for many color spaces.\n */\nexport class Color extends Pt {\n\n  // XYZ property for Standard Observer 2deg, Daylight/sRGB illuminant D65\n  private static D65:PtLike = new Pt(95.047, 100, 108.883, 1);\n\n  protected _mode:ColorType = \"rgb\";\n  private _isNorm:boolean = false;\n\n  /**\n   * Value range for each color space\n   */\n  static ranges:{ [name: string]: Group } = {\n    rgb: new Group( new Pt(0,255), new Pt(0,255), new Pt(0,255) ),\n    hsl: new Group( new Pt(0,360), new Pt(0,1), new Pt(0,1) ),\n    hsb: new Group( new Pt(0,360), new Pt(0,1), new Pt(0,1) ),\n    lab: new Group( new Pt(0,100), new Pt(-128,127), new Pt(-128, 127) ),\n    lch: new Group( new Pt(0,100), new Pt(0,100), new Pt(0,360) ),\n    luv: new Group( new Pt(0,100), new Pt(-134,220), new Pt(-140,122) ),\n    xyz: new Group( new Pt(0,100), new Pt(0,100), new Pt(0,100) )\n  };\n\n  /**\n   * Create a Color. Same as creating a Pt.\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties\n   */\n  constructor( ...args ) {\n    super( ...args );\n  }\n\n\n  /**\n   * Create a Color object with defaults to 4 dimensions\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties\n   */\n  static from( ...args ):Color {\n    let p = [1,1,1,1];\n    let c = Util.getArgs( args );\n    for (let i=0, len=p.length; i<len; i++) {\n      if (i < c.length) p[i] = c[i];\n    }\n    return new Color( p );\n  }\n\n\n  /**\n   * Convert a rgb hex string like #FF0000 or #F00 to a Color object\n   * @param hex a hex string, with optional '#' prefix\n   */\n  static fromHex( hex:string ):Color {\n\n    if (hex[0] == \"#\") hex = hex.substr(1); // remove '#' if needed\n    if (hex.length <= 3) {\n      let fn = (i) => hex[i]||\"F\";\n      hex = `${fn(0)}${fn(0)}${fn(1)}${fn(1)}${fn(2)}${fn(2)}`;\n    }\n\n    let alpha = 1;\n    if (hex.length === 8) {\n      alpha = hex.substr(6) && 0xFF / 255;\n      hex = hex.substring( 0, 6 );\n    }\n\n    let hexVal = parseInt( hex, 16 );\n    return new Color( hexVal >> 16, hexVal >> 8 & 0xFF, hexVal & 0xFF, alpha );\n\n  }\n\n\n  /**\n   * Create RGB Color\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties.\n   */\n  static rgb( ...args ):Color { return Color.from( ...args ).toMode( \"rgb\" ); }\n  \n  /**\n   * Create HSL Color\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties.\n   */\n  static hsl( ...args ):Color { return Color.from( ...args ).toMode( \"hsl\" ); }\n\n  /**\n   * Create HSB Color\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties.\n   */\n  static hsb( ...args ):Color { return Color.from( ...args ).toMode( \"hsb\" ); }\n  \n  /**\n   * Create LAB Color\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties.\n   */\n  static lab( ...args ):Color { return Color.from( ...args ).toMode( \"lab\" ); }\n\n  /**\n   * Create LCH Color\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties.\n   */\n  static lch( ...args ):Color { return Color.from( ...args ).toMode( \"lch\" ); }\n\n  /**\n   * Create LUV Color\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties.\n   */\n  static luv( ...args ):Color { return Color.from( ...args ).toMode( \"luv\" ); }\n\n  /**\n   * Create XYZ Color\n   * @param args Pt-like parameters which can be a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties.\n   */\n  static xyz( ...args ):Color { return Color.from( ...args ).toMode( \"xyz\" ); }\n\n\n  /**\n   * Get a Color object whose values are the maximum of its mode\n   * @param mode a mode string such as \"rgb\" or \"lab\"\n   * @example Color.maxValue(\"rgb\") will return a rgb Color object with values (255,255,255)\n   */\n  static maxValues( mode:string ):Pt { return Color.ranges[mode].zipSlice(1).$take([0,1,2]); }\n\n\n  /**\n   * Get a hex string such as \"#FF0000\". Same as `toString(\"hex\")`\n   */\n  public get hex():string { return this.toString(\"hex\"); }\n  \n  /**\n   * Get a rgb string such as \"rgb(255,0,0)\". Same as `toString(\"rgb\")`\n   */\n  public get rgb():string { return this.toString(\"rgb\"); }\n\n  /**\n   * Get a rgba string such as \"rgb(255,0,0,0.5)\". Same as `toString(\"rgba\")`\n   */\n  public get rgba():string { return this.toString(\"rgba\"); }\n  \n\n  /**\n   * Clone this Color\n   */\n  clone():Color {\n    let c = new Color( this );\n    c.toMode( this._mode );\n    return c;\n  }\n\n  /**\n   * Convert this color from current color space to another color space\n   * @param mode a ColorType string: \"rgb\" \"hsl\" \"hsb\" \"lab\" \"lch\" \"luv\" \"xyz\";\n   * @param convert if `true`, convert this Color to the new color space specified in `mode`. Default is `false`, which only sets the color mode without converting color values.\n   */\n  toMode( mode:ColorType, convert:boolean=false ):this { \n    \n    if (convert) {\n      let fname = this._mode.toUpperCase()+\"to\"+mode.toUpperCase();      \n      if (Color[fname]) {\n        this.to( Color[fname]( this, this._isNorm, this._isNorm ) );\n      } else {\n        throw new Error( \"Cannot convert color with \"+fname);\n      }\n    }\n\n    this._mode = mode; \n    return this;\n  }\n\n\n  /**\n   * Get this Color's mode\n   */\n  get mode():ColorType { return this._mode; }\n\n\n  // rgb\n  get r():number { return this[0]; }\n  set r( n:number ) { this[0] = n; }\n\n  get g():number { return this[1]; }\n  set g( n:number ) { this[1] = n; }\n\n  get b():number { return this[1]; }\n  set b( n:number ) { this[2] = n; }\n\n  // hsl, hsb\n  get h():number { return (this._mode == \"lch\") ? this[2] : this[0]; }\n  set h( n:number ) { \n    let i = (this._mode == \"lch\") ? 2 : 0; \n    this[i] = n;\n  }\n\n  get s():number { return this[1]; }\n  set s( n:number ) { this[1] = n; }\n\n  get l():number { return (this._mode == \"hsl\") ? this[2] : this[0]; }\n  set l( n:number ) { \n    let i = (this._mode == \"hsl\") ? 2 : 0; \n    this[i] = n;\n  }\n\n  // lab, lch, luv\n  get a():number { return this[1]; }\n  set a( n:number ) { this[1] = n; }\n\n  get c():number { return this[1]; }\n  set c( n:number ) { this[1] = n; }\n\n  get u():number { return this[1]; }\n  set u( n:number ) { this[1] = n; }\n\n  get v():number { return this[1]; }\n  set v( n:number ) { this[2] = n; }\n\n\n  /**\n   * Get alpha value\n   */\n  get alpha():number { return (this.length > 3) ? this[3] : 1; }\n\n\n  /**\n   * Normalize the color values to between 0 to 1, or revert it back to the min/max values in current color mode\n   * @param toNorm a boolean value specifying whether to normalize (`true`) or revert (`false`)\n   */\n  normalize( toNorm:boolean=true ):Color {\n    if (this._isNorm == toNorm) return this;\n\n    let ranges = Color.ranges[ this._mode ];\n    \n    for (let i=0; i<3; i++) {\n      this[i] = (!toNorm) \n        ? Num.mapToRange( this[i], 0, 1, ranges[i][0], ranges[i][1] ) \n        : Num.mapToRange( this[i], ranges[i][0], ranges[i][1], 0, 1 );\n    }\n    \n    this._isNorm = toNorm;\n\n    return this;\n  }\n\n\n  /**\n   * Like `normalize()` but returns as a new Color\n   * @param toNorm a boolean value specifying whether to normalize (`true`) or revert (`false`)\n   * @returns new Color\n   */\n  $normalize( toNorm:boolean=true ):Color { return this.clone().normalize( toNorm ); }\n\n\n  /**\n   * Convert this Color to a string. It can be used to get a hex or rgb string for use in rendering\n   * @param format \"hex\", \"rgb\", \"rgba\", or \"mode\" which means using current color mode label. Default is \"mode\".\n   */\n  toString( format:(\"hex\"|\"rgb\"|\"rgba\"|\"mode\")=\"mode\" ):string {\n    if (format == \"hex\") {\n      let _hex = (n:number) => {\n        let s = Math.floor(n).toString(16);\n        return (s.length < 2) ? '0'+s : s;\n      };\n      return `#${_hex(this[0])}${_hex(this[1])}${_hex(this[2])}`;\n\n    } else if (format == \"rgba\") {\n      return `rgba(${Math.floor(this[0])},${Math.floor(this[1])},${Math.floor(this[2])},${this.alpha}`;\n\n    } else if (format == \"rgb\") {  \n      return `rgb(${Math.floor(this[0])},${Math.floor(this[1])},${Math.floor(this[2])}`;\n\n    } else {\n      return `${this._mode}(${this[0]},${this[1]},${this[2]},${this.alpha})`;\n    }\n  }\n\n\n  /**\n   * Convert RGB to HSL\n   * @param rgb a RGB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new HSL Color\n   */\n  static RGBtoHSL( rgb:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let [r,g,b] = (!normalizedInput) ? rgb.$normalize() : rgb;\n\n    let max = Math.max( r, g, b );\n    let min = Math.min( r, g, b );\n    let h = (max+min)/2;\n    let s = h;\n    let l = h;\n\n    if (max == min) {\n      h = 0;\n      s = 0; // achromatic\n    } else {\n      let d = max - min;\n      s = (l > 0.5) ? d / (2 - max - min) : d / (max + min);\n\n      h = 0;\n      if (max === r) {\n        h = (g - b) / d + ( (g < b) ? 6 : 0 );\n      } else if (max === g) {\n        h = (b - r) / d + 2;\n      } else if (max === b) {\n        h = (r - g) / d + 4;\n      }\n    }\n\n    return Color.hsl( ((normalizedOutput) ? h/60 : h*60), s, l, rgb.alpha );\n  }\n\n  /**\n   * Convert HSL to RGB\n   * @param hsl a HSL Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new RGB Color\n   */\n  static HSLtoRGB( hsl:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let [h, s, l] = hsl;\n    if (!normalizedInput) h = h/360;\n    \n    if (s == 0) return Color.rgb( l*255, l*255, l*255, hsl.alpha );\n\n    let q = (l <= 0.5) ? l * (1 + s) : l + s - (l * s);\n    let p = 2 * l - q;\n\n    let convert = (t) => {\n      t = (t < 0) ? t + 1 : (t > 1) ? t - 1 : t;\n      if (t * 6 < 1) {\n        return p + (q - p) * t * 6;\n      } else if (t * 2 < 1) {\n        return q;\n      } else if (t * 3 < 2) {\n        return p + (q - p) * ((2 / 3) - t) * 6;\n      } else {\n        return p;\n      }\n    };\n\n    let sc = (normalizedOutput) ? 1 : 255; \n    \n    return Color.rgb( \n      sc * convert( ( h + 1/3 ) ),\n      sc * convert( h ),\n      sc * convert( ( h - 1/3 ) ),\n      hsl.alpha\n    );\n\n  }\n  \n  /**\n   * Convert RGB to HSB\n   * @param rgb a RGB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new HSB Color\n   */\n  static RGBtoHSB( rgb:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let [r,g,b] = (!normalizedInput) ? rgb.$normalize() : rgb;\n\n    let max = Math.max( r, g, b );\n    let min = Math.min( r, g, b );\n    let d = max - min;\n    let h = 0;\n    let s = (max === 0) ? 0 : d/max;\n    let v = max;\n\n    if (max != min) {\n      if (max === r) {\n        h = (g - b) / d + ( (g < b) ? 6 : 0 );\n      } else if (max === g) {\n        h = (b - r) / d + 2;\n      } else if (max === b) {\n        h = (r - g) / d + 4;\n      }\n    }\n\n    return Color.hsb( ((normalizedOutput) ? h/60 : h*60), s, v, rgb.alpha );\n  }\n\n\n  /**\n   * Convert HSB to RGB\n   * @param hsb a HSB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new RGB Color\n   */\n  static HSBtoRGB( hsb:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let [h, s, v] = hsb;\n    if (!normalizedInput) h = h/360;\n\n    let i = Math.floor( h * 6 );\n    let f = h * 6 - i;\n    let p = v * (1 - s);\n    let q = v * (1 - f * s);\n    let t = v * (1 - (1 - f) * s);\n    \n    let pick = [\n      [v, t, p], [q, v, p], [p, v, t],\n      [p, q, v], [t, p, v], [v, p, q] \n    ];\n    let c = pick[ i%6 ];\n    \n    let sc = (normalizedOutput) ? 1 : 255; \n\n    return Color.rgb( \n      sc * c[0],\n      sc * c[1],\n      sc * c[2],\n      hsb.alpha\n    );\n  }\n\n    /**\n   * Convert RGB to LAB\n   * @param rgb a RGB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new LAB Color\n   */\n  static RGBtoLAB( rgb:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? rgb.$normalize( false ) : rgb;\n    return Color.XYZtoLAB( Color.RGBtoXYZ(c), false, normalizedOutput );\n  }\n\n\n  /**\n   * Convert LAB to RGB\n   * @param lab a LAB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new RGB Color\n   */\n  static LABtoRGB( lab:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? lab.$normalize( false ) : lab;\n    return Color.XYZtoRGB( Color.LABtoXYZ( c ), false, normalizedOutput );\n  }\n\n\n  /**\n   * Convert RGB to LCH\n   * @param rgb a RGB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new LCH Color\n   */\n  static RGBtoLCH( rgb:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? rgb.$normalize( false ) : rgb;\n    return Color.LABtoLCH( Color.RGBtoLAB(c), false, normalizedOutput );\n  }\n  \n\n  /**\n   * Convert LCH to RGB\n   * @param lch a LCH Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new RGB Color\n   */\n  static LCHtoRGB( lch:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? lch.$normalize( false ) : lch;\n    return Color.LABtoRGB( Color.LCHtoLAB(c), false, normalizedOutput );\n  }\n\n\n  /**\n   * Convert RGB to LUV\n   * @param rgb a RGB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new LUV Color\n   */\n  static RGBtoLUV( rgb:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? rgb.$normalize( false ) : rgb;\n    return Color.XYZtoLUV( Color.RGBtoXYZ(c), false, normalizedOutput );\n  }\n\n\n  /**\n   * Convert LUV to RGB\n   * @param rgb a RGB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new RGB Color\n   */\n  static LUVtoRGB( luv:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? luv.$normalize( false ) : luv;\n    return Color.XYZtoRGB( Color.LUVtoXYZ( c ), false, normalizedOutput );\n  }\n\n\n  /**\n   * Convert RGB to XYZ\n   * @param rgb a RGB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new XYZ Color\n   */\n  static RGBtoXYZ( rgb:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (!normalizedInput) ? rgb.$normalize() : rgb.clone();\n\n    for (let i=0; i<3; i++) {\n      c[i] = ( c[i] > 0.04045 ) ? Math.pow( (c[i]+0.055)/1.055, 2.4 ) : c[i]/12.92;\n      if (!normalizedOutput) c[i] = c[i] * 100;\n    }\n\n    let cc = Color.xyz(\n      c[0] * 0.4124564 + c[1] * 0.3575761 + c[2] * 0.1804375,\n      c[0] * 0.2126729 + c[1] * 0.7151522 + c[2] * 0.0721750,\n      c[0] * 0.0193339 + c[1] * 0.1191920 + c[2] * 0.9503041,\n      rgb.alpha\n    );\n\n    return (normalizedOutput) ? cc.normalize() : cc;\n  }\n\n\n  /**\n   * Convert XYZ to RGB\n   * @param xyz a XYZ Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new RGB Color\n   */\n  static XYZtoRGB( xyz:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let [x,y,z] = (!normalizedInput) ? xyz.$normalize() : xyz;\n\n    let rgb = [\n      x *  3.2404542 + y * -1.5371385 + z * -0.4985314,\n      x * -0.9692660 + y *  1.8760108 + z *  0.0415560,\n      x *  0.0556434 + y * -0.2040259 + z *  1.0572252\n    ];\n\n    // convert xyz to rgb. Note that not all colors are visible in rgb, so here we bound rgb between 0 to 1\n    for (let i=0; i<3; i++) {\n      rgb[i] = (rgb[i]<0) ? 0 : ( rgb[i] > 0.0031308 ) ? (1.055 * Math.pow(rgb[i], 1/2.4) - 0.055) : (12.92 * rgb[i]);\n      rgb[i] = Math.max( 0,  Math.min( 1, rgb[i] ));\n      if (!normalizedOutput) rgb[i] = Math.round( rgb[i] * 255 );\n    }\n\n    let cc = Color.rgb( rgb[0], rgb[1], rgb[2], xyz.alpha );\n    return (normalizedOutput) ? cc.normalize() : cc;\n  }\n\n\n  /**\n   * Convert XYZ to LAB\n   * @param xyz a XYZ Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new LAB Color\n   */\n  static XYZtoLAB( xyz:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? xyz.$normalize(false) : xyz.clone();\n\n    // adjust for D65  \n    c.divide( Color.D65 );\n\n    let fn = (n)=> ( n > 0.008856 ) ? Math.pow(n, 1/3) : (7.787 * n) + 16/116;\n    let cy = fn( c[1] );\n\n    let cc = Color.lab(\n      (116 * cy) - 16,\n      500 * (fn(c[0]) - cy),\n      200 * (cy - fn(c[2])),\n      xyz.alpha\n    );\n    return (normalizedOutput) ? cc.normalize() : cc;\n  }\n\n  /**\n   * Convert LAB to XYZ\n   * @param lab a LAB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new XYZ Color\n   */\n  static LABtoXYZ( lab:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? lab.$normalize(false) : lab;\n    let y = (c[0] + 16) / 116;\n    let x = (c[1] / 500) + y;\n    let z = y - c[2]/200;\n\n    let fn = (n) => {\n      let nnn = n*n*n;\n      return ( nnn > 0.008856 ) ? nnn : ( n - 16 / 116 ) / 7.787;\n    };\n\n    let d = Color.D65;\n\n    // adjusted\n    let cc = Color.xyz(\n      // Math.max(0, Math.min( 100, d[0] * fn(x) )),\n      // Math.max(0, Math.min( 100, d[1] * fn(y) )),\n      // Math.max(0, Math.min( 100, d[2] * fn(z) )),\n      Math.max( 0, d[0] * fn(x) ),\n      Math.max( 0, d[1] * fn(y) ),\n      Math.max( 0, d[2] * fn(z) ),\n      lab.alpha\n    );\n\n    return (normalizedOutput) ? cc.normalize() : cc;\n  }\n\n\n  /**\n   * Convert XYZ to LUV\n   * @param xyz a XYZ Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new LUV Color\n   */\n  static XYZtoLUV( xyz:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let [x,y,z] = (normalizedInput) ? xyz.$normalize(false) : xyz;\n    let u = (4 * x) / (x + (15 * y) + (3 * z));\n    let v = (9 * y) / (x + (15 * y) + (3 * z));\n\n    y = y / 100;\n    y = ( y > 0.008856 ) ? Math.pow( y, 1/3 ) : ( 7.787 * y + 16 / 116 );\n\n    let refU = (4 * Color.D65[0]) / (Color.D65[0] + (15 * Color.D65[1]) + ( 3 * Color.D65[2]));\n    let refV = (9 * Color.D65[1]) / (Color.D65[0] + (15 * Color.D65[1]) + ( 3 * Color.D65[2]));\n\n    let L = (116 * y) - 16;\n    return Color.luv(\n      L, 13*L*(u - refU), 13*L*(v - refV), xyz.alpha\n    );\n  }\n\n\n  /**\n   * Convert LUV to XYZ\n   * @param luv a LUV Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new XYZ Color\n   */\n  static LUVtoXYZ( luv:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let [l,u,v] = (normalizedInput) ? luv.$normalize(false) : luv;\n    let y = ( l + 16 ) / 116;\n    let cubeY = y*y*y;\n    y = (cubeY > 0.008856) ? cubeY : (y - 16/116) / 7.787;\n\n    let refU = (4 * Color.D65[0]) / ( Color.D65[0] + (15 * Color.D65[1]) + (3 * Color.D65[2]) );\n    let refV = (9 * Color.D65[1]) / ( Color.D65[0] + (15 * Color.D65[1]) + (3 * Color.D65[2]) );\n\n    u = u / (13 * l) + refU;\n    v = v / (13 * l) + refV;\n\n    y = y * 100;\n    let x = -1*(9 * y * u)/((u-4)*v - u*v);\n    let z = (9 * y - (15 * v * y) - (v * x))/(3 * v);\n\n    return Color.xyz( x, y, z, luv.alpha );\n  }\n\n\n  /**\n   * Convert LAB to LCH\n   * @param lab a LAB Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new LCH Color\n   */\n  static LABtoLCH( lab:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? lab.$normalize(false) : lab;\n    let h = Geom.toDegree( Geom.boundRadian( Math.atan2( c[2], c[1] ) ) ); // 0 to 360 degrees\n    return Color.lch(\n      c[0], Math.sqrt( c[1]*c[1]+c[2]*c[2] ), h, lab.alpha\n    );\n  }\n\n\n  /**\n   * Convert LCH to LAB\n   * @param lch a LCH Color\n   * @param normalizedInput a boolean specifying whether input color is normalized. Default is not normalized: `false`.\n   * @param normalizedOutput a boolean specifying whether output color shoud be normalized. Default is not normalized: `false`.\n   * @returns a new LAB Color\n   */\n  static LCHtoLAB( lch:Color, normalizedInput:boolean=false, normalizedOutput:boolean=false):Color {\n    let c = (normalizedInput) ? lch.$normalize(false) : lch;\n    let rad = Geom.toRadian( c[2] );\n    return Color.lab(\n      c[0], Math.cos( rad ) * c[1], Math.sin( rad ) * c[1], lch.alpha\n    );\n  }\n\n\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Color.ts","// Source code licensed under Apache License 2.0. \r\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\r\n\r\n\r\nimport {Pt, Group, PtLike, GroupLike} from \"./Pt\";\r\nimport {Line, Triangle} from \"./Op\";\r\nimport {Bound} from \"./Bound\";\r\nimport {Const} from \"./Util\";\r\nimport {Num, Geom} from \"./Num\";\r\nimport {Vec} from \"./LinearAlgebra\";\r\n\r\n\r\n/**\r\n * The `Create` class provides various convenient functions to create structures or shapes. \r\n */\r\nexport class Create {\r\n  \r\n\r\n  /**\r\n   * Create a set of random points inside a bounday\r\n   * @param bound the rectangular boundary\r\n   * @param count number of random points to create\r\n   * @param dimensions number of dimensions in each point\r\n   */\r\n  static distributeRandom( bound:Bound, count:number, dimensions:number=2 ):Group {\r\n    let pts = new Group();\r\n    for (let i=0; i<count; i++) {\r\n      let p = [ bound.x + Math.random()*bound.width ];\r\n      if (dimensions>1) p.push( bound.y + Math.random()*bound.height, );\r\n      if (dimensions>2) p.push( bound.z + Math.random()*bound.depth );\r\n      pts.push( new Pt( p ) );\r\n    }\r\n    return pts;\r\n  }\r\n\r\n\r\n  /**\r\n   * Create a set of points that distribute evenly on a line\r\n   * @param line a Group representing a line\r\n   * @param count number of points to create\r\n   */\r\n  static distributeLinear( line:GroupLike, count:number ):Group {\r\n    let ln = Line.subpoints( line, count-2 );\r\n    ln.unshift( line[0] );\r\n    ln.push( line[line.length-1] );\r\n    return ln;\r\n  }\r\n  \r\n\r\n  /**\r\n   * Create an evenly distributed set of points (like a grid of points) inside a boundary.\r\n   * @param bound the rectangular boundary\r\n   * @param columns number of columns\r\n   * @param rows number of rows\r\n   * @param orientation a Pt or number array to specify where the point should be inside a cell. Default is [0.5, 0.5] which places the point in the middle.\r\n   * @returns a Group of Pts\r\n   */\r\n  static gridPts( bound:Bound, columns:number, rows:number, orientation:PtLike=[0.5, 0.5] ):Group {\r\n    if (columns === 0 || rows === 0) throw new Error(\"grid columns and rows cannot be 0\");\r\n    let unit = bound.size.$subtract(1).$divide( columns, rows );\r\n    let offset = unit.$multiply( orientation );\r\n    let g = new Group();\r\n    for (let r=0; r<rows; r++) {\r\n      for (let c=0; c<columns; c++) {\r\n        g.push( bound.topLeft.$add( unit.$multiply(c, r) ).add( offset ) );\r\n      }\r\n    }\r\n    return g;\r\n    \r\n  }\r\n\r\n  /**\r\n   * Create a grid inside a boundary\r\n   * @param bound the rectangular boundary\r\n   * @param columns number of columns\r\n   * @param rows number of rows\r\n   * @returns an array of Groups, where each group represents a rectangular cell\r\n   */\r\n  static gridCells( bound:Bound, columns:number, rows:number  ):Group[] {\r\n    if (columns === 0 || rows === 0) throw new Error(\"grid columns and rows cannot be 0\");\r\n    let unit = bound.size.$subtract(1).divide( columns, rows ); // subtract 1 to fill whole border of rectangles\r\n    let g = [];\r\n    for (let r=0; r<rows; r++) {\r\n      for (let c=0; c<columns; c++) {\r\n        g.push( new Group(\r\n          bound.topLeft.$add( unit.$multiply(c, r) ),\r\n          bound.topLeft.$add( unit.$multiply(c, r).add( unit ) )\r\n        ));\r\n      }\r\n    }\r\n    return g;\r\n  }\r\n\r\n\r\n  /**\r\n   * Create a set of Pts around a circular path\r\n   * @param center circle center\r\n   * @param radius circle radius\r\n   * @param count number of Pts to create\r\n   */\r\n  static radialPts( center:PtLike, radius:number, count:number ):Group {\r\n    let g = new Group();\r\n    let a = Const.two_pi/count;\r\n    for (let i=0; i<count; i++) {\r\n      g.push( new Pt(center).toAngle( a*i - Const.half_pi, radius, true ) );\r\n    }\r\n    return g;\r\n  }\r\n\r\n\r\n  /**\r\n   * Given a group of Pts, return a new group of `Noise` Pts.\r\n   * @param pts a Group or an array of Pts\r\n   * @param dx small increment value in x dimension\r\n   * @param dy small increment value in y dimension\r\n   * @param rows Optional row count to generate 2D noise\r\n   * @param columns Optional column count to generate 2D noise\r\n   */\r\n  static noisePts( pts:GroupLike, dx=0.01, dy=0.01, rows=0, columns=0 ):Group {\r\n    let seed = Math.random();\r\n    let g = new Group();\r\n    for (let i=0, len=pts.length; i<len; i++) {\r\n      let np = new Noise( pts[i] );\r\n      let r = (rows && rows > 0) ? Math.floor(i/rows) : i;\r\n      let c = (columns && columns > 0) ? i%columns : i;\r\n      np.initNoise( dx*c, dy*r );\r\n      np.seed( seed );\r\n      g.push( np );\r\n    }\r\n    return g;\r\n  }\r\n\r\n\r\n  /**\r\n   * Create a Delaunay Group. Use the `.delaunay()` and `.voronoi()` functions in the returned group to generate tessellations.\r\n   * @param pts a Group or an array of Pts\r\n   * @returns an instance of the Delaunay class\r\n   */\r\n  static delaunay( pts:GroupLike ):Delaunay {\r\n    return Delaunay.from( pts ) as Delaunay;\r\n  }\r\n  \r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * Perlin noise gradient indices\r\n */\r\nconst grad3 = [\r\n  [1,1, 0], [-1,1, 0], [1,-1,0], [-1,-1,0],\r\n  [1,0, 1], [-1, 0, 1], [1,0,-1], [-1,0,-1],\r\n  [0, 1,1], [ 0,-1,1], [0,1,-1], [ 0,-1,-1]\r\n];\r\n\r\n\r\n/**\r\n * Perlin noise permutation table\r\n */ \r\nconst permTable = [151,160,137,91,90,15,\r\n  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\r\n  190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\r\n  88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,\r\n  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\r\n  102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,\r\n  135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,\r\n  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\r\n  223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,\r\n  129,22,39,253,9,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,\r\n  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\r\n  49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,\r\n  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180\r\n];\r\n\r\n\r\n/**\r\n * A class to generate Perlin noise. Currently it implements a basic 2D noise. More to follow.\r\n * Based on https://gist.github.com/banksean/304522\r\n */\r\nexport class Noise extends Pt {\r\n\r\n  protected perm:number[] = [];\r\n  private _n:Pt = new Pt(0.01, 0.01);\r\n\r\n  /**\r\n   * Create a Noise Pt that's capable of generating noise\r\n   * @param args a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties\r\n   */\r\n  constructor(...args) {\r\n    super( ...args );\r\n\r\n    // For easier index wrapping, double the permutation table length\r\n    this.perm = permTable.concat( permTable );\r\n  }\r\n\r\n\r\n  /**\r\n   * Set the initial noise values\r\n   * @param args a list of numeric parameters, an array of numbers, or an object with {x,y,z,w} properties\r\n   * @example `noise.initNoise( 0.01, 0.1 )`\r\n   */\r\n  initNoise( ...args ) {\r\n    this._n = new Pt( ...args );\r\n  }\r\n\r\n\r\n  /**\r\n   * Add a small increment to the noise values\r\n   * @param x step in x dimension\r\n   * @param y step in y dimension\r\n   */\r\n  step( x=0, y=0 ) {\r\n    this._n.add( x, y );\r\n  }\r\n\r\n  /**\r\n   * Specify a seed for this Noise\r\n   * @param s seed value\r\n   */\r\n  seed( s ) {\r\n    if (s > 0 && s < 1) s *= 65536;\r\n    \r\n    s = Math.floor(s);\r\n    if (s < 256)s |= s << 8;\r\n\r\n    for (let i=0; i<255; i++) {\r\n      let v = (i & 1) ? permTable[i] ^ (s & 255) : permTable[i] ^ ((s>>8) & 255);\r\n      this.perm[i] = this.perm[i + 256] = v;\r\n    }\r\n  }\r\n  \r\n  \r\n  /**\r\n   * Generate a 2D Perlin noise value\r\n   */\r\n  noise2D() {\r\n  \r\n    let i = Math.floor( this._n[0] ) % 255;\r\n    let j = Math.floor( this._n[1] ) % 255;\r\n    let x = (this._n[0] % 255) - i;\r\n    let y = (this._n[1] % 255) - j;\r\n\r\n    let n00 = Vec.dot(grad3[ (i+this.perm[j]) % 12 ], [x, y, 0] );\r\n    let n01 = Vec.dot(grad3[ (i+this.perm[j+1]) % 12 ], [x, y-1, 0] );\r\n    let n10 = Vec.dot(grad3[ (i+1+this.perm[j]) % 12 ], [x-1, y, 0] );\r\n    let n11 = Vec.dot(grad3[ (i+1+this.perm[j+1]) % 12 ], [x-1, y-1, 0] );\r\n\r\n    let _fade = (f) => f*f*f*(f*(f*6-15)+10);\r\n    let tx = _fade(x);\r\n    return Num.lerp( Num.lerp(n00, n10, tx), Num.lerp(n01, n11, tx), _fade(y) );\r\n  }\r\n  \r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * A DelaunayShape is an object with 3 indices, a Triangle Group and a Circle Group.\r\n */\r\nexport type DelaunayShape = {i:number, j:number, k:number, triangle:GroupLike, circle:Group };\r\nexport type DelaunayMesh = {[key:string]:DelaunayShape}[];\r\n\r\n\r\n/**\r\n * Delaunay is a Group of Pts that can generate Delaunay and Voronoi tessellations. The triangulation algorithm is ported from [Pt](https://github.com/williamngan/pt)\r\n * This implementation is based on [Paul Bourke's algorithm](http://paulbourke.net/papers/triangulate/)\r\n * with reference to its [javascript implementation by ironwallaby](https://github.com/ironwallaby/delaunay)\r\n */\r\nexport class Delaunay extends Group {\r\n\r\n  private _mesh:DelaunayMesh = [];\r\n\r\n  /**\r\n   * Generate Delaunay triangles. This function also caches the mesh that is used to generate Voronoi tessellation in `voronoi()`.\r\n   * @param triangleOnly if true, returns an array of triangles in Groups, otherwise return the whole DelaunayShape\r\n   * @returns an array of Groups or an array of DelaunayShapes `{i, j, k, triangle, circle}` which records the indices of the vertices, and the calculated triangles and circumcircles\r\n   */\r\n  delaunay( triangleOnly:boolean=true ):GroupLike[]|DelaunayShape[] {\r\n    if (this.length < 3) return [];\r\n\r\n    this._mesh = [];\r\n\r\n    let n = this.length;\r\n\r\n    // sort the points and store the sorted index\r\n    let indices:number[] = [];\r\n    for (let i=0; i<n; i++) indices[i] = i;\r\n    indices.sort( (i,j) => this[j][0] - this[i][0] );\r\n\r\n    // duplicate the points list and add super triangle's points to it\r\n    let pts = this.slice();\r\n    let st = this._superTriangle();\r\n    pts = pts.concat( st );\r\n\r\n    // arrays to store edge buffer and opened triangles\r\n    let opened:DelaunayShape[] = [ this._circum( n, n+1, n+2, st) ];\r\n    let closed:DelaunayShape[] = [];\r\n    let tris:GroupLike[] = [];\r\n\r\n    // Go through each point using the sorted indices\r\n    for (let i=0, len=indices.length; i<len; i++) {\r\n      let c = indices[i];\r\n      let edges:number[] = [];\r\n      let j = opened.length;\r\n      if (!this._mesh[c]) this._mesh[c] = {};\r\n\r\n      // Go through each opened triangles\r\n      while (j--) {\r\n        let circum:DelaunayShape = opened[j];\r\n        let radius = circum.circle[1][0];\r\n        let d = pts[c].$subtract( circum.circle[0] );\r\n\r\n        // if point is to the right of circumcircle, add it to closed list and don't check again\r\n        if (d[0] > 0 && d[0]*d[0] > radius*radius) {\r\n          closed.push( circum );\r\n          tris.push( circum.triangle );\r\n          opened.splice(j, 1);\r\n          continue;\r\n        }\r\n\r\n        // if it's outside the circumcircle, skip\r\n        if ( d[0]*d[0] + d[1]*d[1] - radius*radius > Const.epsilon) {\r\n          continue;\r\n        }\r\n\r\n        // otherwise it's inside the circumcircle, so we add to edge buffer and remove it from the opened list\r\n        edges.push( circum.i, circum.j,    circum.j, circum.k,    circum.k, circum.i );\r\n        opened.splice(j, 1);\r\n      }\r\n\r\n      // dedup edges\r\n      Delaunay._dedupe( edges );\r\n\r\n      // Go through the edge buffer and create a triangle for each edge\r\n      j = edges.length;\r\n      while (j > 1) {\r\n        opened.push( this._circum( edges[--j], edges[--j], c, false, pts) );\r\n      }\r\n\r\n    }\r\n\r\n    for (let i=0, len=opened.length; i<len; i++) {\r\n      let o = opened[i];\r\n      if (o.i < n && o.j < n && o.k < n) {\r\n        closed.push( o );\r\n        tris.push( o.triangle );\r\n        this._cache( o );\r\n      }\r\n    }\r\n\r\n    return (triangleOnly) ? tris : closed;\r\n  }\r\n\r\n\r\n  /**\r\n   * Generate Voronoi cells. `delaunay()` must be called before calling this function.\r\n   * @returns an array of Groups, each of which represents a Voronoi cell\r\n   */\r\n  voronoi():Group[] {\r\n    let vs = [];\r\n    let n = this._mesh;\r\n    for (let i=0, len=n.length; i<len; i++) {\r\n      vs.push( this.neighborPts( i, true ) );\r\n    }\r\n    return vs;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get the cached mesh. The mesh is an array of objects, each of which representing the enclosing triangles around a Pt in this Delaunay group\r\n   * @return an array of objects that store a series of DelaunayShapes\r\n   */\r\n  mesh():DelaunayMesh {\r\n    return this._mesh;\r\n  }\r\n\r\n\r\n  /**\r\n   * Given an index of a Pt in this Delaunay Group, returns its neighboring Pts in the network\r\n   * @param i index of a Pt\r\n   * @param sort if true, sort the neighbors so that their edges will form a polygon\r\n   * @returns an array of Pts\r\n   */\r\n  neighborPts( i:number, sort=false ):GroupLike {\r\n    let cs = new Group();\r\n    let n = this._mesh;\r\n    for (let k in n[i]) {\r\n      if (n[i].hasOwnProperty(k)) cs.push( n[i][k].circle[0] );\r\n    }\r\n    return (sort) ? Geom.sortEdges( cs ) : cs;\r\n  }\r\n\r\n\r\n  /**\r\n   * Given an index of a Pt in this Delaunay Group, returns its neighboring DelaunayShapes\r\n   * @param i index of a Pt\r\n   * @returns an array of DelaunayShapes `{i, j, k, triangle, circle}`\r\n   */\r\n  neighbors( i:number ):DelaunayShape[] {\r\n    let cs = [];\r\n    let n = this._mesh;\r\n    for (let k in n[i]) {\r\n      if (n[i].hasOwnProperty(k)) cs.push( n[i][k] );\r\n    }\r\n    return cs;\r\n  }\r\n\r\n\r\n  /**\r\n   * Record a DelaunayShape in the mesh\r\n   * @param o DelaunayShape instance\r\n   */\r\n  protected _cache( o ):void {\r\n    this._mesh[o.i][`${Math.min(o.j,o.k)}-${Math.max(o.j,o.k)}`] = o;\r\n    this._mesh[o.j][`${Math.min(o.i,o.k)}-${Math.max(o.i,o.k)}`] = o;\r\n    this._mesh[o.k][`${Math.min(o.i,o.j)}-${Math.max(o.i,o.j)}`] = o;\r\n  }\r\n\r\n\r\n  /**\r\n   * Get the initial \"super triangle\" that contains all the points in this set\r\n   * @returns a Group representing a triangle\r\n   */\r\n  protected _superTriangle():Group {\r\n    let minPt = this[0];\r\n    let maxPt = this[0];\r\n    for (let i=1, len=this.length; i<len; i++) {\r\n      minPt = minPt.$min( this[i] );\r\n      maxPt = maxPt.$max( this[i] );\r\n    }\r\n\r\n    let d = maxPt.$subtract( minPt );\r\n    let mid = minPt.$add( maxPt ).divide(2);\r\n    let dmax = Math.max( d[0], d[1] );\r\n\r\n    return new Group( mid.$subtract(20*dmax, dmax), mid.$add( 0, 20*dmax), mid.$add(20*dmax, -dmax) );\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a triangle from 3 points in a list of points\r\n   * @param i index 1\r\n   * @param j index 2\r\n   * @param k index 3\r\n   * @param pts a Group of Pts\r\n   */\r\n  protected _triangle( i:number, j:number, k:number, pts:GroupLike=this):Group {\r\n    return new Group( pts[i], pts[j], pts[k] );\r\n  }\r\n\r\n\r\n  /**\r\n   * Get a circumcircle and triangle from 3 points in a list of points\r\n   * @param i index 1\r\n   * @param j index 2\r\n   * @param k index 3\r\n   * @param tri a Group representing a triangle, or `false` to create it from indices\r\n   * @param pts a Group of Pts\r\n   */\r\n  protected _circum(i:number, j:number, k:number, tri:GroupLike|false, pts:GroupLike=this):DelaunayShape {\r\n    let t = tri || this._triangle( i, j, k, pts );\r\n    return {\r\n      i: i,\r\n      j: j,\r\n      k: k,\r\n      triangle: t,\r\n      circle: Triangle.circumcircle( t )\r\n    };\r\n  }\r\n\r\n\r\n  /**\r\n   * Dedupe the edges array\r\n   * @param edges \r\n   */\r\n  protected static _dedupe( edges:number[] ):number[] {\r\n    let j = edges.length;\r\n\r\n    while (j > 1) {\r\n      let b = edges[--j];\r\n      let a = edges[--j];\r\n      let i=j;\r\n\r\n      while (i > 1) {\r\n        let n = edges[--i];\r\n        let m = edges[--i];\r\n\r\n        if ((a == m && b == n) || (a == n && b == m)) {\r\n          edges.splice(j, 2);\r\n          edges.splice(i, 2);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return edges;\r\n  }\r\n\r\n\r\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Create.ts","// Source code licensed under Apache License 2.0. \n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport {IPlayer} from './Space';\nimport {VisualForm, Font} from \"./Form\";\nimport {Bound} from './Bound';\nimport {Geom} from './Num';\nimport {Const} from './Util';\nimport {Pt, PtLike, GroupLike, Group} from './Pt';\nimport {Rectangle} from \"./Op\";\nimport {DOMSpace, DOMFormContext} from \"./Dom\";\n\n\n\n/**\n * A Space for SVG elements\n */\nexport class SVGSpace extends DOMSpace {\n  \n  id: string = \"svgspace\";\n  protected _bgcolor:string = \"#999\";\n  \n\n  /**\n  * Create a SVGSpace which represents a Space for SVG elements\n  * @param elem Specify an element by its \"id\" attribute as string, or by the element object itself. An element can be an existing `<svg>`, or a `<div>` container in which a new `<svg>` will be created. If left empty, a `<div id=\"pt_container\"><svg id=\"pt\" /></div>` will be added to DOM. Use css to customize its appearance if needed.\n  * @param callback an optional callback `function(boundingBox, spaceElement)` to be called when canvas is appended and ready. Alternatively, a \"ready\" event will also be fired from the `<svg>` element when it's appended, which can be traced with `spaceInstance.canvas.addEventListener(\"ready\")`\n  * @example `new SVGSpace( \"#myElementID\" )`\n  */\n  constructor( elem:string|Element, callback?:Function ) {\n    super( elem, callback );\n    \n    if (this._canvas.nodeName.toLowerCase() != \"svg\") {\n      let s = SVGSpace.svgElement( this._canvas, \"svg\", `${this.id}_svg` );\n      this._container = this._canvas;\n      this._canvas = s as SVGElement;\n    }\n  }\n  \n\n  /**\n  * Get a new `SVGForm` for drawing\n  * @see `SVGForm`\n  */\n  getForm():SVGForm { return new SVGForm( this ); }\n  \n\n  /**\n  * Get the html element\n  */\n  get element():Element {\n    return this._canvas;\n  }\n\n  /**\n  * This overrides Space's `resize` function. It's used as a callback function for window's resize event and not usually called directly. You can keep track of resize events with `resize: (bound ,evt)` callback in your player objects (See `Space`'s `add()` function). \n  * @param b a Bound object to resize to\n  * @param evt Optionally pass a resize event\n  */\n  resize( b:Bound, evt?:Event):this {\n    super.resize( b, evt );\n    SVGSpace.setAttr( this.element, {\n      \"viewBox\": `0 0 ${this.bound.width} ${this.bound.height}`,\n      \"width\": `${this.bound.width}`,\n      \"height\": `${this.bound.height}`,\n      \"xmlns\": \"http://www.w3.org/2000/svg\",\n      \"version\": \"1.1\"\n    });\n    return this;\n  }\n  \n\n  /**\n   * A static function to add a svg element inside a node. Usually you don't need to use this directly. See methods in `SVGForm` instead.\n   * @param parent the parent element, or `null` to use current `<svg>` as parent.\n   * @param name a string of element name,  such as `rect` or `circle`\n   * @param id id attribute of the new element\n   */\n  static svgElement( parent:Element, name:string, id?:string ):SVGElement {\n    if (!parent || !parent.appendChild ) throw new Error( \"parent is not a valid DOM element\" );\n    \n    let elem = document.querySelector(`#${id}`);\n\n    if (!elem) {\n      elem = document.createElementNS( \"http://www.w3.org/2000/svg\", name );\n      elem.setAttribute( \"id\", id );\n      \n      parent.appendChild( elem );\n    }\n    return elem as SVGElement;\n  }\n  \n  \n  \n  /**\n  * Remove an item from this Space\n  * @param item a player item with an auto-assigned `animateID` property\n  */\n  remove( player:IPlayer ):this {\n    let temp = this._container.querySelectorAll( \".\"+SVGForm.scopeID( player ) );\n    \n    temp.forEach( (el:Element) => { \n      el.parentNode.removeChild( el );\n    });\n    \n    return super.remove( player );\n  }\n  \n  \n  /**\n   * Remove all items from this Space\n   */\n  removeAll():this {\n    this._container.innerHTML = \"\";\n    return super.removeAll();\n  }\n  \n}\n\n\n/**\n* SVGForm is an implementation of abstract class VisualForm. It provide methods to express Pts on SVGSpace.   \n* You may extend SVGForm to implement your own expressions for SVGSpace.\n*/\nexport class SVGForm extends VisualForm {\n  \n  protected _ctx:DOMFormContext = {\n    group: null,\n    groupID: \"pts\",\n    groupCount: 0,\n    currentID: \"pts0\",\n    currentClass: \"\",\n    style: {\n      \"filled\": true,\n      \"stroked\": true,\n      \"fill\": \"#f03\",\n      \"stroke\": \"#fff\",\n      \"stroke-width\": 1,\n      \"stroke-linejoin\": \"bevel\",\n      \"stroke-linecap\": \"sqaure\"\n    },\n    font: \"11px sans-serif\",\n    fontSize: 11,\n    fontFamily: \"sans-serif\"\n  };\n  \n  static groupID:number = 0;\n  static domID:number = 0;\n  \n  protected _space:SVGSpace;\n  protected _ready:boolean = false;\n  \n\n  /**\n  * Create a new SVGForm. You may also use `space.getForm()` to get the default form.\n  * @param space an instance of SVGSpace\n  */\n  constructor( space:SVGSpace ) {\n    super();\n    this._space = space;\n    \n    this._space.add( { start: () => {\n      this._ctx.group = this._space.element;\n      this._ctx.groupID = \"pts_svg_\"+(SVGForm.groupID++);\n      this._ready = true;\n    }} );\n  }\n  \n\n  /**\n  * get the SVGSpace instance that this form is associated with\n  */\n  get space():SVGSpace { return this._space; }\n  \n  \n  /**\n   * Update a style in _ctx context or throw an Erorr if the style doesn't exist\n   * @param k style key\n   * @param v  style value\n   */\n  protected styleTo( k, v ) { \n    if (this._ctx.style[k] === undefined) throw new Error(`${k} style property doesn't exist`);\n    this._ctx.style[k] = v; \n  }\n  \n\n  /**\n    * Set current fill style. Provide a valid color string or `false` to specify no fill color.\n    * @example `form.fill(\"#F90\")`, `form.fill(\"rgba(0,0,0,.5\")`, `form.fill(false)`\n    * @param c fill color\n    */\n  fill( c:string|boolean ):this {\n    if (typeof c == \"boolean\") {\n      this.styleTo( \"filled\", c );\n    } else {\n      this.styleTo( \"filled\", true );\n      this.styleTo( \"fill\", c );\n    }\n    return this;\n  }\n  \n\n  /**\n    * Set current stroke style. Provide a valid color string or `false` to specify no stroke color.\n    * @example `form.stroke(\"#F90\")`, `form.stroke(\"rgba(0,0,0,.5\")`, `form.stroke(false)`, `form.stroke(\"#000\", 0.5, 'round', 'square')`\n    * @param c stroke color which can be as color, gradient, or pattern. (See [canvas documentation](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle))\n    * @param width Optional value (can be floating point) to set line width\n    * @param linejoin Optional string to set line joint style. Can be \"miter\", \"bevel\", or \"round\".\n    * @param linecap Optional string to set line cap style. Can be \"butt\", \"round\", or \"square\".\n    */\n  stroke( c:string|boolean, width?:number, linejoin?:string, linecap?:string ):this {\n    if (typeof c == \"boolean\") {\n      this.styleTo( \"stroked\", c );\n    } else {\n      this.styleTo( \"stroked\", true );\n      this.styleTo( \"stroke\", c );\n      if (width) this.styleTo( \"stroke-width\", width );\n      if (linejoin) this.styleTo( \"stroke-linejoin\", linejoin );\n      if (linecap) this.styleTo( \"stroke-linecap\", linecap );\n    }\n    return this;\n  }\n\n\n  /**\n   * Add custom class to the created element\n   * @param c custom class name or `false` to reset it\n   * @example `form.fill(\"#f00\").cls(\"myClass\").rects(r)` `form.cls(false).circles(c)`\n   */\n  cls( c:string|boolean ) {\n    if (typeof c == \"boolean\") {\n      this._ctx.currentClass = \"\";\n    } else {\n      this._ctx.currentClass = c;\n    }\n    return this;\n  }\n  \n  \n  /**\n  * Set the current font \n  * @param sizeOrFont either a number to specify font-size, or a `Font` object to specify all font properties\n  * @param weight Optional font-weight string such as \"bold\"\n  * @param style Optional font-style string such as \"italic\"\n  * @param lineHeight Optional line-height number suchas 1.5\n  * @param family Optional font-family such as \"Helvetica, sans-serif\"\n  * @example `form.font( myFont )`, `form.font(14, \"bold\")`\n  */\n  font( sizeOrFont:number|Font, weight?:string, style?:string, lineHeight?:number, family?:string ):this {\n    if (typeof sizeOrFont == \"number\") {\n      \n      this._font.size = sizeOrFont;\n      if (family) this._font.face = family;\n      if (weight) this._font.weight = weight;\n      if (style) this._font.style = style;\n      if (lineHeight) this._font.lineHeight = lineHeight;\n      this._ctx.font = this._font.value;\n      \n    } else {\n      this._font = sizeOrFont;\n    }\n    return this;\n  }\n  \n\n  /**\n  * Reset the context's common styles to this form's styles. This supports using multiple forms on the same canvas context.\n  */\n  reset():this {\n    this._ctx.style = {\n      \"filled\": true, \"stroked\": true,\n      \"fill\": \"#f03\", \"stroke\": \"#fff\",\n      \"stroke-width\": 1,\n      \"stroke-linejoin\": \"bevel\",\n      \"stroke-linecap\": \"sqaure\"\n    };\n\n    this._font = new Font( 14, \"sans-serif\");\n    this._ctx.font = this._font.value;\n\n    return this;\n  }\n\n  \n  /**\n   * Set this form's group scope by an ID, and optionally define the group's parent element. A group scope keeps track of elements by their generated IDs, and updates their properties as needed. See also `scope()`.\n   * @param group_id a string to use as prefix for the group's id. For example, group_id \"hello\" will create elements with id like \"hello-1\", \"hello-2\", etc\n   * @param group Optional DOM or SVG element to define this group's parent element\n   * @returns this form's context\n   */\n  updateScope( group_id:string, group?:Element ):object {\n    this._ctx.group = group;\n    this._ctx.groupID = group_id;\n    this._ctx.groupCount = 0;\n    this.nextID();\n    return this._ctx;\n  }\n  \n\n  /**\n   * Set the current group scope to an item added into space, in order to keep track of any point, circle, etc created within it. The item must have an `animateID` property, so that elements created within the item will have generated IDs like \"item-{animateID}-{count}\".\n   * @param item a \"player\" item that's added to space (see `space.add(...)`) and has an `animateID` property\n   * @returns this form's context\n   */\n  scope( item:IPlayer ) {\n    if (!item || item.animateID == null ) throw new Error(\"item not defined or not yet added to Space\");\n    return this.updateScope( SVGForm.scopeID( item ), this.space.element );\n  }\n  \n  \n  /**\n   * Get next available id in the current group\n   * @returns an id string\n   */\n  nextID():string {\n    this._ctx.groupCount++;\n    this._ctx.currentID = `${this._ctx.groupID}-${this._ctx.groupCount}`;\n    return this._ctx.currentID;\n  }\n  \n\n  /**\n   * A static function to generate an ID string based on a context object\n   * @param ctx a context object for an SVGForm\n   */\n  static getID( ctx ):string {\n    return ctx.currentID || `p-${SVGForm.domID++}`;\n  }\n\n\n  /**\n   * A static function to generate an ID string for a scope, based on a \"player\" item in the Space\n   * @param item a \"player\" item that's added to space (see `space.add(...)`) and has an `animateID` property\n   */\n  static scopeID( item:IPlayer ):string {\n    return `item-${item.animateID}`;\n  }\n  \n\n  /**\n   * A static function to help adding style object to an element. This put all styles into `style` attribute instead of individual attributes, so that the styles can be parsed by Adobe Illustrator.\n   * @param elem A DOM element to add to\n   * @param styles an object of style properties\n   * @example `SVGForm.style(elem, {fill: \"#f90\", stroke: false})`\n   * @returns this DOM element \n   */\n  static style( elem:SVGElement, styles:object) {\n    let st = [];\n\n    if ( !styles[\"filled\"] ) st.push( \"fill: none\");\n    if ( !styles[\"stroked\"] ) st.push( \"stroke: none\");\n        \n    for (let k in styles) {\n      if ( styles.hasOwnProperty(k) && k != \"filled\" && k != \"stroked\" ) {\n        let v = styles[k];\n        if (v) {\n          if ( !styles[\"filled\"] && k.indexOf('fill') === 0 ) {\n            continue;\n          } else if ( !styles[\"stroked\"] && k.indexOf('stroke') === 0 ) {\n            continue;\n          } else {\n            st.push( `${k}: ${v}` );\n          }\n        }\n      }\n    }\n    \n    return DOMSpace.setAttr( elem, {style: st.join(\";\")} );\n  }\n  \n  \n  /**\n    * Draws a point\n    * @param ctx a context object of SVGForm\n    * @param pt a Pt object or numeric array\n    * @param radius radius of the point. Default is 5.\n    * @param shape The shape of the point. Defaults to \"square\", but it can be \"circle\" or a custom shape function in your own implementation.\n    * @example `SVGForm.point( p )`, `SVGForm.point( p, 10, \"circle\" )`\n    */\n  static point( ctx:DOMFormContext, pt:PtLike, radius:number=5, shape:string=\"square\" ):SVGElement {\n    if (shape === \"circle\") {\n      return SVGForm.circle( ctx, pt, radius );\n    } else {\n      return SVGForm.square( ctx, pt, radius );\n    }\n  }\n  \n  \n  /**\n    * Draws a point\n    * @param p a Pt object\n    * @param radius radius of the point. Default is 5.\n    * @param shape The shape of the point. Defaults to \"square\", but it can be \"circle\" or a custom shape function in your own implementation.\n    * @example `form.point( p )`, `form.point( p, 10, \"circle\" )`\n    */\n  point( pt:PtLike, radius:number=5, shape:string=\"square\" ):this {\n    this.nextID();\n    SVGForm.point( this._ctx, pt, radius, shape );\n    return this;\n  }\n  \n\n  /**\n    * A static function to draw a circle\n    * @param ctx a context object of SVGForm\n    * @param pt center position of the circle\n    * @param radius radius of the circle\n    */\n  static circle( ctx:DOMFormContext, pt:PtLike, radius:number=10 ):SVGElement {\n    let elem = SVGSpace.svgElement( ctx.group, \"circle\", SVGForm.getID(ctx) );\n    \n    DOMSpace.setAttr( elem, {\n      cx: pt[0],\n      cy: pt[1],\n      r: radius,\n      'class': `pts-svgform pts-circle ${ctx.currentClass}`,\n    });\n    \n    SVGForm.style( elem, ctx.style );\n    return elem;\n  }\n  \n\n  /**\n    * Draw a circle\n    * @param pts usually a Group of 2 Pts, but it can also take an array of two numeric arrays [ [position], [size] ]\n    * @see [`Circle.fromCenter`](./_op_.circle.html#frompt)\n    */\n  circle( pts:GroupLike|number[][] ):this {\n    this.nextID();\n    SVGForm.circle( this._ctx, pts[0], pts[1][0] );\n    return this;\n  }\n  \n\n  /**\n    * A static function to draw an arc.\n    * @param ctx a context object of SVGForm\n    * @param pt center position \n    * @param radius radius of the arc circle\n    * @param startAngle start angle of the arc\n    * @param endAngle end angle of the arc\n    * @param cc an optional boolean value to specify if it should be drawn clockwise (`false`) or counter-clockwise (`true`). Default is clockwise.\n    */\n  static arc( ctx:DOMFormContext, pt:PtLike, radius:number, startAngle:number, endAngle:number, cc?:boolean ):SVGElement {\n    let elem = SVGSpace.svgElement( ctx.group, \"path\", SVGForm.getID( ctx ) );\n    \n    const start = new Pt(pt).toAngle( startAngle, radius, true );\n    const end = new Pt(pt).toAngle( endAngle, radius, true );\n    const diff = Geom.boundAngle(endAngle) - Geom.boundAngle(startAngle);\n    let largeArc = ( diff > Const.pi ) ? true : false;\n    if (cc) largeArc = !largeArc;\n    const sweep = (cc) ? \"0\" : \"1\";\n    \n    const d = `M ${start[0]} ${start[1]} A ${radius} ${radius} 0 ${largeArc ? \"1\" : \"0\"} ${sweep} ${end[0]} ${end[1]}`;\n    \n    DOMSpace.setAttr( elem, { \n      d: d,\n      'class': `pts-svgform pts-arc ${ctx.currentClass}`,\n    } );\n    SVGForm.style( elem, ctx.style );\n    return elem;\n  }\n  \n\n  /**\n    * Draw an arc.\n    * @param pt center position\n    * @param radius radius of the arc circle\n    * @param startAngle start angle of the arc\n    * @param endAngle end angle of the arc\n    * @param cc an optional boolean value to specify if it should be drawn clockwise (`false`) or counter-clockwise (`true`). Default is clockwise.\n    */\n  arc( pt:PtLike, radius:number, startAngle:number, endAngle:number, cc?:boolean ):this {\n    this.nextID();\n    SVGForm.arc( this._ctx, pt, radius, startAngle, endAngle, cc );\n    return this;\n  }\n  \n\n  /**\n    * A static function to draw a square \n    * @param ctx a context object of SVGForm\n    * @param pt center position of the square\n    * @param halfsize half size of the square\n    */\n  static square( ctx:DOMFormContext, pt:PtLike, halfsize:number ) {\n    let elem = SVGSpace.svgElement( ctx.group, \"rect\", SVGForm.getID( ctx ) );\n    DOMSpace.setAttr( elem, {\n      x: pt[0]-halfsize, \n      y:pt[1]-halfsize, \n      width: halfsize*2, \n      height: halfsize*2,\n      'class': `pts-svgform pts-square ${ctx.currentClass}`,\n    });\n    SVGForm.style( elem, ctx.style );\n    return elem;\n  }\n  \n\n  /**\n   * Draw a square, given a center and its half-size\n   * @param pt center Pt\n   * @param halfsize half-size\n   */\n  square( pt:PtLike, halfsize:number ):this {\n    this.nextID();\n    SVGForm.square( this._ctx, pt, halfsize );\n    return this;\n  } \n  \n\n  /**\n  * A static function to draw a line\n  * @param ctx a context object of SVGForm\n  * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\n  */\n  static line( ctx:DOMFormContext, pts:GroupLike|number[][] ):SVGElement {\n    if (!this._checkSize( pts)) return;\n    \n    if (pts.length > 2) return SVGForm._poly( ctx, pts, false );\n    \n    let elem = SVGSpace.svgElement( ctx.group, \"line\", SVGForm.getID( ctx ) );\n    \n    DOMSpace.setAttr( elem, {\n      x1: pts[0][0],\n      y1: pts[0][1],\n      x2: pts[1][0],\n      y2: pts[1][1],\n      'class': `pts-svgform pts-line ${ctx.currentClass}`,\n    });\n    \n    SVGForm.style( elem, ctx.style );\n    return elem;\n  }\n  \n\n  /**\n  * Draw a line or polyline\n  * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\n  */\n  line( pts:GroupLike|number[][] ):this {\n    this.nextID();\n    SVGForm.line( this._ctx, pts );\n    return this;\n  }\n  \n  \n  /**\n   * A static helper function to draw polyline or polygon\n   * @param ctx a context object of SVGForm\n   * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\n   * @param closePath a boolean to specify if the polygon path should be closed\n   */\n  static _poly( ctx:DOMFormContext, pts:GroupLike|number[][], closePath:boolean=true) {\n    if (!this._checkSize( pts)) return;\n    \n    let elem = SVGSpace.svgElement( ctx.group, ((closePath) ? \"polygon\" : \"polyline\"), SVGForm.getID(ctx) );\n    let points:string = (pts as number[][]).reduce( (a, p) => a+`${p[0]},${p[1]} `, \"\");\n    DOMSpace.setAttr( elem, {\n      points: points,\n      'class': `pts-svgform pts-polygon ${ctx.currentClass}`,\n    });    \n    SVGForm.style( elem, ctx.style );\n    return elem;\n  }\n  \n  \n  /**\n    * A static function to draw polygon\n    * @param ctx a context object of SVGForm\n    * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\n    */\n  static polygon( ctx:DOMFormContext, pts:GroupLike|number[][] ):SVGElement {\n    return SVGForm._poly( ctx, pts, true );\n  }\n  \n\n  /**\n  * Draw a polygon\n  * @param pts a Group of multiple Pts, or an array of multiple numeric arrays\n  */\n  polygon( pts:GroupLike|number[][] ):this {\n    this.nextID();\n    SVGForm.polygon( this._ctx, pts );\n    return this;\n  }\n  \n  \n  /**\n  * A static function to draw a rectangle\n  * @param ctx a context object of SVGForm\n  * @param pts usually a Group of 2 Pts specifying the top-left and bottom-right positions. Alternatively it can be an array of numeric arrays.\n  */\n  static rect( ctx:DOMFormContext, pts:GroupLike|number[][] ):SVGElement {\n    if (!this._checkSize( pts)) return;\n    \n    let elem = SVGSpace.svgElement( ctx.group, \"rect\", SVGForm.getID(ctx) );\n    let bound = Group.fromArray( pts ).boundingBox();\n    let size = Rectangle.size( bound );\n    \n    DOMSpace.setAttr( elem, {\n      x: bound[0][0],\n      y: bound[0][1],\n      width: size[0],\n      height: size[1],\n      'class': `pts-svgform pts-rect ${ctx.currentClass}`,\n    });\n    \n    SVGForm.style( elem, ctx.style );\n    return elem;\n  }\n  \n  \n  /**\n    * Draw a rectangle\n    * @param pts usually a Group of 2 Pts specifying the top-left and bottom-right positions. Alternatively it can be an array of numeric arrays.\n    */\n  rect( pts:number[][]|Pt[] ):this {\n    this.nextID();\n    SVGForm.rect( this._ctx, pts );\n    return this;\n  }\n  \n  \n  /**\n    * A static function to draw text\n    * @param ctx a context object of SVGForm\n    * @param `pt` a Point object to specify the anchor point\n    * @param `txt` a string of text to draw\n    * @param `maxWidth` specify a maximum width per line\n    */\n  static text( ctx:DOMFormContext, pt:PtLike, txt:string ):SVGElement {\n    let elem = SVGSpace.svgElement( ctx.group, \"text\", SVGForm.getID(ctx) );\n    \n    DOMSpace.setAttr( elem, {\n      \"pointer-events\": \"none\",\n      x: pt[0],\n      y: pt[1],\n      dx: 0, dy: 0,\n      'class': `pts-svgform pts-text ${ctx.currentClass}`,\n    });\n    \n    elem.textContent = txt;\n    \n    SVGForm.style( elem, ctx.style );\n    \n    return elem;\n  }\n  \n\n  /**\n    * Draw text on canvas\n    * @param `pt` a Pt or numeric array to specify the anchor point\n    * @param `txt` text\n    * @param `maxWidth` specify a maximum width per line\n    */\n  text( pt:PtLike, txt:string ): this {\n    this.nextID();\n    SVGForm.text( this._ctx, pt, txt );\n    return this;\n  }\n  \n\n  /**\n    * A convenient way to draw some text on canvas for logging or debugging. It'll be draw on the top-left of the canvas as an overlay.\n    * @param txt text\n    */\n  log( txt ):this {\n    this.fill(\"#000\").stroke(\"#fff\", 0.5).text( [10,14], txt );   \n    return this;\n  }\n  \n  \n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/Svg.ts","// Source code licensed under Apache License 2.0.\n// Copyright © 2017 William Ngan. (https://github.com/williamngan/pts)\n\n\nimport {Pt, Group} from \"./Pt\";\nimport { Rectangle, Circle } from \"./Op\";\n\n\n/**\n * An enumeration of different UI types\n */\nexport enum UIShape {\n  Rectangle, Circle, Polygon, Polyline, Line\n}\n\nexport const UIPointerActions = {\n  up: \"up\", down: \"down\", move: \"move\", drag: \"drag\", drop: \"drop\", over: \"over\", out: \"out\"\n};\n\n\n/**\n * UIListener type\n */\nexport type UIHandler = ( pt:Pt, target:UI, type:string ) => void;\n\n\nexport class UI {\n  group: Group;\n  shape: UIShape;\n\n  protected _id:string;\n  protected _actions: {[key:string]: UIHandler };\n  protected _states: {[key:string]: any};\n\n\n  /**\n   * Wrap an UI insider a group\n   */\n  constructor( group:Group, shape:UIShape, states: {}, id?:string ) {\n    this.group = group;\n    this.shape = shape;\n    this._id = id;\n    this._states = states;\n    this._actions = {};\n  }\n\n\n  /**\n   * Get and set uique id\n   */\n  get id():string { return this._id; }\n  set id( d:string ) { this._id = d; } \n\n\n  /**\n   * Get a state\n   * @param key state's name\n   */\n  state( key:string ):any {\n    return this._states[key] || false;\n  }\n\n\n  /**\n   * Add an event handler\n   * @param key event key\n   * @param fn handler function\n   */\n  on( key:string, fn:UIHandler ) {\n    this._actions[key] = fn;\n    return this;\n  }\n\n\n  /**\n   * Remove an event handler\n   * @param key even key\n   * @param fn \n   */\n  off( key:string ) {\n    delete this._actions[key];\n    return this;\n  }\n\n\n  /**\n   * Listen for interactions and trigger action handlers\n   * @param key action key\n   * @param p point to check\n   */\n  listen( key:string, p:Pt ):boolean {\n    if ( this._actions[key] !== undefined ) {\n      if ( this._trigger(p) ) {\n        this._actions[key]( p, this, key );\n        return true;\n      }\n    }\n    return false;\n  }\n\n\n  /**\n   * Take a custom render function to render this UI\n   * @param fn render function\n   */\n  render( fn:( group:Group, states:{[key:string]: any}) => void ) {\n    fn( this.group, this._states );\n  }\n\n\n  /**\n   * Check intersection using a specific function based on UIShape\n   * @param p a point to check\n   */\n  protected _trigger( p:Pt ):boolean {\n    let fn = null;\n    if (this.shape === UIShape.Rectangle) {\n      fn = Rectangle.withinBound;\n    } else if (this.shape === UIShape.Circle) {\n      fn = Circle.withinBound;\n    } else if (this.shape === UIShape.Polygon) {\n      fn = Rectangle.withinBound;\n    } else {\n      return false;\n    }\n\n    return fn( this.group, p );\n  }\n\n}\n\n\n/**\n * A simple UI button that can track clicks and hovers\n */\nexport class UIButton extends UI {\n\n  _clicks:number = 0;\n\n  constructor( group:Group, shape:UIShape, states: {}, id?:string ) {\n    super( group, shape, states, id );\n  }\n\n  \n  /**\n   * Get the total number of clicks on this UIButton\n   */\n  get clicks():number { return this._clicks; }\n\n\n  /**\n   * Add a click handler\n   * @param fn a function to handle clicks\n   */\n  onClick( fn:UIHandler ) {\n    this._clicks++;\n    this.on( UIPointerActions.up, fn );\n  }\n\n  \n  /**\n   * Add hover handler\n   * @param over a function to handle when pointer enters hover\n   * @param out a function to handle when pointer exits hover\n   */\n  onHover( over:UIHandler, out:UIHandler ) {\n    this.on( UIPointerActions.over, over);\n    this.on( UIPointerActions.out, out);\n  }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/UI.ts","import * as _Bound from \"./Bound\";\nimport * as _Canvas from \"./Canvas\";\nimport * as _Create from \"./Create\";\nimport * as _Form from \"./Form\";\nimport * as _LinearAlgebra from \"./LinearAlgebra\";\nimport * as _Num from \"./Num\";\nimport * as _Op from \"./Op\";\nimport * as _Pt from \"./Pt\";\nimport * as _Space from \"./Space\";\nimport * as _Color from \"./Color\";\nimport * as _Util from \"./Util\";\nimport * as _Dom from \"./Dom\";\nimport * as _Svg from \"./Svg\";\nimport * as _Typography from \"./Typography\";\n\n// A function to switch scope for Pts library. eg, Pts.scope( Pts, window );\nlet namespace = ( sc:object ) => {\n  let lib = module.exports;\n  for (let k in lib) {\n    if (k!=\"namespace\") {\n      sc[k] = lib[k];\n    }\n  }\n};\n\nmodule.exports = {\n  namespace,\n  ..._Bound,\n  ..._Canvas,\n  ..._Create,\n  ..._Form,\n  ..._LinearAlgebra,\n  ..._Op,\n  ..._Num,\n  ..._Pt,\n  ..._Space,\n  ..._Util,\n  ..._Color,\n  ..._Dom,\n  ..._Svg,\n  ..._Typography\n};\n\n\n// WEBPACK FOOTER //\n// ./~/tslint-loader??ref--0!./src/_lib.ts"],"sourceRoot":""}