{"version":3,"sources":["https://lively-kernel.org/lively4/composed-offset/src/client/graphics.js"],"names":["pt","rect","Point","ensure","duck","x","y","polar","r","theta","Math","cos","sin","fromLiteral","literal","fromTuple","tuple","constructor","isPoint","getX","getY","toFixed","val","addPt","p","addXY","dx","dy","addX","addY","midPt","subPt","subXY","scaleBy","scaleX","scaleYOrUndefined","scaleByPt","scalePt","negated","inverted","invertedSafely","rotateBy","angle","lessPt","leqPt","eqPt","equals","withX","withY","copy","minPt","acc","min","maxPt","max","random","normalized","fastNormalized","fastR","dotProduct","matrixTransform","mx","a","c","e","b","d","f","matrixTransformDirection","rounded","round","dist","sqrt","distSquared","manhattanDistance","abs","nearestPointOnLineBetween","p1","p2","x1","y1","x21","y21","t","magnitude","hypot","angleToVec","other","acos","scaleToFit","outer","innerAspectRatio","outerAspectRatio","scale","i","atan2","asRectangle","Rectangle","extent","ext","extentAsRectangle","lineTo","end","Line","toTuple","toLiteral","toString","inspect","JSON","stringify","livelyProbeWidget","fromAny","ptA","ptB","width","height","unionPts","points","length","inset","left","top","right","bottom","undefined","corners","sides","w","h","isRectangle","getWidth","getHeight","withWidth","withHeight","withExtent","withTopLeft","bottomRight","withTopRight","bottomLeft","withBottomRight","topLeft","withBottomLeft","topRight","withLeftCenter","withRightCenter","withTopCenter","withBottomCenter","withCenter","insetBy","insetByPt","divide","relativeRects","orig","map","relRect","otherRect","center1","center","center2","lineBetween","start","lineIntersection","maxX","maxY","leftCenter","rightCenter","topCenter","bottomCenter","topEdge","bottomEdge","leftEdge","rightEdge","edges","allPoints","j","push","isNonEmpty","containsRect","intersects","intersection","containsPoint","translatedBy","scaleByRect","scaleRectIn","fullRect","scaleRectTo","scaleScalarFromRelativeOrigin","origin","absoluteOrigin","relativeToAbsPoint","scaleScalarFromAbsOrigin","expandBy","delta","translateForInclusion","transformRectForInclusion","newBottomRight","innerBottomRight","insetByRect","outsetByRect","nx","ny","nw","nh","union","line","edge","filter","ea","closestPointToPt","relPt","absToRelativePoint","absPt","realWidth","realHeight","area","sign","randomPoint","constrainPt","toInsetTuple","toAttributeValue","result","concat","invoke","centerX","centerY","partNamed","partName","call","withPartNamed","newValue","setterName","toUpperCase","slice","partNameNear","partNames","partNameNearest","pDist","nearest","Transform","exp","translation","rotation","angleInRadians","ensureNumber","pow","fromMatrix","isTransform","getScale","s","eps","getScalePoint","sx","sy","getTranslation","isTranslation","toSVGAttributeValue","attr","getRotation","sp","toCSSValue","bounds","offsetX","offsetY","toCSSTransformString","rot","toMatrix","transformPoint","transformDirection","matrixTransformForMinMax","transformRectToRect","Infinity","preConcatenate","m","matrix_","invert","det","invdet","inverse","matrix","value","isNaN","Error","fromCoords","startX","startY","endX","endY","isLine","sampleN","n","vector","stepPt","sample","otherLine","includesPoint","unconstrained","x2","y2","x3","y3","collinear","xMin","yMin","xMax","yMax","constrained","start1","end1","start2","end2","x4","y4","between","arg1","arg2","arg3","arg4"],"mappings":"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","file":"graphics.js","sourcesContent":["// import { num, string, grid } from \"lively.lang\";\n// import { cssLengthToPixels } from \"./convert-css-length.js\";\n\n/* copied from lively.graphics and removed dependency to lively.lang */\n\n\nexport class Point {\n\n  static ensure(duck) {\n    return duck instanceof Point ?\n      duck : new Point(duck.x, duck.y);\n  }\n\n  static polar(r, theta) {\n    // theta=0 is East on the screen,\n    // increases in counter-clockwise direction\n    return new Point(r * Math.cos(theta), r * Math.sin(theta));\n  }\n\n  // static random(scalePt) {\n  //   return new Point(num.randomSmallerInteger(scalePt.x), num.randomSmallerInteger(scalePt.y));\n  // }\n\n  static fromLiteral(literal) {\n    return pt(literal.x, literal.y);\n  }\n\n  static fromTuple(tuple) { return pt(tuple[0], tuple[1]); }\n\n  constructor(x, y) {\n    this.x = x || 0;\n    this.y = y || 0;\n  }\n\n  get isPoint() { return true }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // accessing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  getX() { return this.x; }\n  getY() { return this.y; }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // arithmetic\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  toFixed(val) {\n    return new Point(this.x.toFixed(val), this.y.toFixed(val))\n  }\n\n  addPt(p) {\n    return new Point(this.x + p.x, this.y + p.y);\n  }\n\n  addXY(dx, dy) {\n    return new Point(this.x + dx, this.y + dy);\n  }\n\n  addX(dx) {\n    return new Point(this.x + dx, this.y);\n  }\n\n  addY(dy) {\n    return new Point(this.x, this.y + dy);\n  }\n\n  midPt(p) {\n    return new Point((this.x + p.x) / 2, (this.y + p.y) / 2);\n  }\n\n  subPt(p) {\n    return new Point(this.x - p.x, this.y - p.y);\n  }\n\n  subXY(dx, dy) {\n    return new Point(this.x - dx, this.y - dy);\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // transforming\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  scaleBy(scaleX, scaleYOrUndefined) {\n    return new Point(this.x * scaleX, this.y * (scaleYOrUndefined||scaleX));\n  }\n\n  scaleByPt(scalePt) {\n    return new Point(this.x * scalePt.x, this.y * scalePt.y);\n  }\n\n  negated() {\n    return new Point(-this.x, -this.y);\n  }\n\n  inverted() {\n    return new Point(1.0 / this.x, 1.0 / this.y);\n  }\n\n  invertedSafely() {\n    return new Point(this.x && 1.0 / this.x, this.y && 1.0 / this.y);\n  }\n  \n  rotateBy(angle) {\n    return Point.polar(this.r(), this.theta() + angle)\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // comparing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  lessPt(p) {\n    return this.x < p.x && this.y < p.y;\n  }\n\n  leqPt(p) {\n    return this.x <= p.x && this.y <= p.y;\n  }\n\n  eqPt(p) {\n    return this.x == p.x && this.y == p.y;\n  }\n\n  equals(p) {\n    return this.x == p.x && this.y == p.y;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // instance creation\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n  withX(x) { return pt(x, this.y); }\n\n  withY(y) { return pt(this.x, y); }\n\n  copy() { return new Point(this.x, this.y); }\n\n  minPt(p, acc) {\n    if (!acc) acc = new Point(0, 0);\n    acc.x = Math.min(this.x, p.x);\n    acc.y = Math.min(this.y, p.y);\n    return acc;\n  }\n\n  maxPt(p, acc) {\n    if (!acc) acc = new Point(0, 0);\n    acc.x = Math.max(this.x, p.x);\n    acc.y = Math.max(this.y, p.y);\n    return acc;\n  }\n\n  random() { return Point.random(this); }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // point functions\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  normalized() {\n    var r = this.r();\n    return pt(this.x / r, this.y / r);\n  }\n\n  fastNormalized() {\n    var r = this.fastR();\n    return pt(this.x / r, this.y / r);\n  }\n\n  dotProduct(p) {\n    return this.x * p.x + this.y * p.y\n  }\n\n  matrixTransform(mx, acc) {\n    // if no accumulator passed, allocate a fresh one\n    if (!acc) acc = pt(0, 0);\n    acc.x = mx.a * this.x + mx.c * this.y + mx.e;\n    acc.y = mx.b * this.x + mx.d * this.y + mx.f;\n    return acc;\n  }\n\n  matrixTransformDirection(mx, acc) {\n    // if no accumulator passed, allocate a fresh one\n    if (!acc) acc = pt(0, 0);\n    acc.x = mx.a * this.x + mx.c * this.y;\n    acc.y = mx.b * this.x + mx.d * this.y;\n    return acc;\n  }\n\n  // griddedBy(grid) {\n  //   return pt(this.x - (this.x % grid.x), this.y - (this.y % grid.y))\n  // }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // geometry computation\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n  // roundTo(quantum) {\n  //   return new Point(num.roundTo(this.x, quantum), num.roundTo(this.y, quantum));\n  // }\n\n  rounded() {\n    return pt(Math.round(this.x), Math.round(this.y))\n  }\n\n  dist(p) {\n    var dx = this.x - p.x,\n        dy = this.y - p.y;\n    return Math.sqrt(dx * dx + dy * dy);\n  }\n\n  distSquared(p) {\n    var dx = this.x - p.x,\n        dy = this.y - p.y;\n    return dx * dx + dy * dy;\n  }\n\n  manhattanDistance(p) {\n    return Math.abs(p.x - this.x) + Math.abs(p.y - this.y);\n  }\n\n  nearestPointOnLineBetween(p1, p2) {\n    if (p1.x == p2.x) return pt(p1.x, this.y);\n    if (p1.y == p2.y) return pt(this.x, p1.y);\n    var x1 = p1.x,\n        y1 = p1.y,\n        x21 = p2.x - x1,\n        y21 = p2.y - y1,\n        t = (((this.y - y1) / x21) + ((this.x - x1) / y21)) / ((x21 / y21) + (y21 / x21));\n    return pt(x1 + (t * x21), y1 + (t * y21));\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // vector math\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  \n  magnitude() {\n    return Math.hypot(this.x, this.y);\n  }\n\n  /**\n   * might return NaN if we have a null vector\n   */\n  angleToVec(other) {\n    return Math.acos(this.dotProduct(other) / (this.magnitude() * other.magnitude()));\n  }\n\n  /**\n   * e.g. fit one rectangle's extent into another\n   * rect.extent().scaleToFit(outerPt)\n   */\n  scaleToFit(outer) {\n    const innerAspectRatio = this.x / this.y;\n    const outerAspectRatio = outer.x / outer.y;\n    let scale;\n    if (innerAspectRatio < outerAspectRatio) {\n      scale = outer.y / this.y;\n    } else {\n      scale = outer.x / this.x;\n    }\n    return pt(scale * this.x, scale * this.y);\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // polar coordinates\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  r() {\n    // Polar coordinates (theta=0 is East on screen, and increases in CCW\n    // direction\n    return Math.sqrt(this.x*this.x + this.y*this.y);\n  }\n\n  fastR() {\n    // actually, r() might be faster...\n    var a = this.x * this.x + this.y * this.y;\n    var x = 17;\n    for (var i = 0; i < 6; i++)\n    x = (x + a / x) / 2;\n    return x;\n  }\n\n  theta() { return Math.atan2(this.y, this.x); }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // converting\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  asRectangle() { return new Rectangle(this.x, this.y, 0, 0); }\n\n  extent(ext) { return new Rectangle(this.x, this.y, ext.x, ext.y); }\n\n  extentAsRectangle() { return new Rectangle(0, 0, this.x, this.y) }\n\n  lineTo(end) { return new Line(this, end); }\n\n  toTuple() { return [this.x, this.y]; }\n\n  toLiteral() { return {x: this.x, y: this.y}; }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // debugging\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  toString() {\n    return \"pt(\"+ this.x +\",\" + this.y + \")\"\n    // return string.format(\"pt(%1.f,%1.f)\", this.x, this.y);\n  }\n\n  inspect() { return JSON.stringify(this); }\n\n  livelyProbeWidget() {\n    return <div>{this.toString()}</div>\n  }\n  \n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // serialization\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // __serialize__() {\n  //   return {__expr__: this.toString(), bindings: {pt: \"lively.graphics/geometry-2d.js\"}}\n  // }\n}\n\n\nexport class Rectangle {\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // factory methods\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n  static fromAny(ptA, ptB) {\n    return rect(ptA.minPt(ptB), ptA.maxPt(ptB));\n  }\n\n  static fromLiteral(literal) {\n    return new Rectangle(literal.x, literal.y, literal.width, literal.height);\n  }\n\n  static fromTuple(tuple) {\n    return new Rectangle(tuple[0], tuple[1], tuple[2], tuple[3]);\n  }\n\n  static unionPts(points) {\n    var min = points[0],\n        max = points[0];\n\n    // starts from 1 intentionally\n    for (var i = 1; i < points.length; i++) {\n      min = min.minPt(points[i]);\n      max = max.maxPt(points[i]);\n    }\n\n    return rect(min, max);\n  }\n\n  static ensure(duck) {\n    return duck instanceof Rectangle ?\n      duck : new Rectangle(duck.x, duck.y, duck.width, duck.height);\n  }\n\n  // static fromElement(element) {\n  //   // FIXME\n  //   if (Object.isFunction(element.getBoundingClientRect)) {\n  //     var b = element.getBoundingClientRect();\n  //     return rect(b.left, b.top, b.width, b.height);\n  //   } else if (element.namespaceURI == \"http://www.w3.org/1999/xhtml\") {\n  //     var x = cssLengthToPixels(element.style.left || \"0px\"),\n  //         y = cssLengthToPixels(element.style.top || \"0px\"),\n  //         width = cssLengthToPixels(element.style.width || \"0px\"),\n  //         height = cssLengthToPixels(element.style.hieght || \"0px\");\n  //     return new Rectangle(x, y, width, height);\n  //   }\n  //   if (element.namespaceURI == \"http://www.w3.org/2000/svg\") {\n  //     return new Rectangle(element.x.baseVal.value, element.y.baseVal.value,\n  //       element.width.baseVal.value, element.height.baseVal.value);\n  //   }\n  //   throw new Error('Cannot create Rectangle from ' + element);\n  // }\n\n  static inset(left, top, right, bottom) {\n    if (top === undefined) top = left;\n    if (right === undefined) right = left;\n    if (bottom === undefined) bottom = top;\n    return new Rectangle(left, top, right - left, bottom - top);\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  //  initialize\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  get corners() { return [\"topLeft\",\"topRight\",\"bottomRight\",\"bottomLeft\"]; }\n  get sides() { return [\"leftCenter\",\"rightCenter\",\"topCenter\",\"bottomCenter\"]; }\n\n  constructor(x, y, w, h) {\n    this.x = x || 0;\n    this.y = y || 0;\n    this.width = w || 0;\n    this.height = h || 0;\n  }\n\n  get isRectangle() { return true }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // accessing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  getX() { return this.x; }\n  getY() { return this.y; }\n  getWidth() { return this.width; }\n  getHeight() { return this.height; }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // instance creation\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  copy() {\n    return new Rectangle(this.x, this.y, this.width, this.height);\n  }\n\n  toFixed(val) {\n    return new Rectangle(this.x.toFixed(val), this.y.toFixed(val), this.width.toFixed(val), this.height.toFixed(val));\n  }\n\n  withWidth(w) {\n    return new Rectangle(this.x, this.y, w, this.height)\n  }\n\n  withHeight(h) {\n    return new Rectangle(this.x, this.y, this.width, h)\n  }\n\n  withX(x) {\n    return new Rectangle(x, this.y, this.width, this.height)\n  }\n\n  withY(y) {\n    return new Rectangle(this.x, y, this.width, this.height)\n  }\n\n  withExtent(ext) {\n    return new Rectangle(this.x, this.y, ext.x, ext.y);\n  }\n\n  withTopLeft(p) {\n    return Rectangle.fromAny(p, this.bottomRight())\n  }\n\n  withTopRight(p) {\n    return Rectangle.fromAny(p, this.bottomLeft())\n  }\n\n  withBottomRight(p) {\n    return Rectangle.fromAny(p, this.topLeft())\n  }\n\n  withBottomLeft(p) {\n    return Rectangle.fromAny(p, this.topRight())\n  }\n\n  withLeftCenter(p) {\n    return new Rectangle(p.x, this.y, this.width + (this.x - p.x), this.height)\n  }\n\n  withRightCenter(p) {\n    return new Rectangle(this.x, this.y, p.x - this.x, this.height)\n  }\n\n  withTopCenter(p) {\n    return new Rectangle(this.x, p.y, this.width, this.height + (this.y - p.y))\n  }\n\n  withBottomCenter(p) {\n    return new Rectangle(this.x, this.y, this.width, p.y - this.y)\n  }\n\n  withCenter(p) {\n    return new Rectangle(p.x-this.width/2,p.y-this.height/2,this.width,this.height);\n  }\n\n  insetBy(d) {\n    return new Rectangle(this.x + d, this.y + d, this.width - (d * 2), this.height - (d * 2));\n  }\n\n  insetByPt(p) {\n    return new Rectangle(this.x + p.x, this.y + p.y, this.width - (p.x * 2), this.height - (p.y * 2));\n  }\n\n  // grid(rows, cols) {\n  //   var w = this.width / cols, h = this.height / rows;\n  //   return grid.mapCreate(rows, cols, function(i, j) {\n  //     return new Rectangle(w*j, h*i, w, h); });\n  // }\n\n  divide(relativeRects) {\n    // takes an array of rectangles specifying the relative parts to divide\n    // this by. Example:\n    // rect(0,0,100,50).divide([rect(0.2,0,0.3,0.5)])\n    //   === [rect(20,0,30,25)]\n    var orig = this;\n    return relativeRects.map(function(relRect) {\n      return rect(orig.x + orig.width*relRect.x,\n                orig.y + orig.height*relRect.y,\n                orig.width*relRect.width,\n                orig.height*relRect.height); });\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // converting\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  toTuple() {\n    return [this.x, this.y, this.width, this.height];\n  }\n\n  lineTo(otherRect) {\n    var center1 = this.center(),\n      center2 = otherRect.center(),\n      lineBetween = center1.lineTo(center2),\n      start = this.lineIntersection(lineBetween)[0],\n      end = otherRect.lineIntersection(lineBetween)[0];\n    return start && end && start.lineTo(end);\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // comparing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  equals(other) {\n    if (!other) {\n      return false;\n    }\n    return this.x == other.x && this.y == other.y && this.width == other.width && this.height == other.height;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // debugging\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  inspect() { return JSON.stringify(this); }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // accessing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  topLeft() {\n    return new Point(this.x, this.y)\n  }\n\n  topRight() {\n    return new Point(this.maxX(), this.y)\n  }\n\n  bottomRight() {\n    return new Point(this.maxX(), this.maxY())\n  }\n\n  bottomLeft() {\n    return new Point(this.x, this.maxY())\n  }\n\n  leftCenter() {\n    return new Point(this.x, this.center().y)\n  }\n\n  rightCenter() {\n    return new Point(this.maxX(), this.center().y)\n  }\n\n  topCenter() {\n    return new Point(this.center().x, this.y)\n  }\n\n  bottomCenter() {\n    return new Point(this.center().x, this.maxY())\n  }\n\n  extent() {\n    return new Point(this.width, this.height);\n  }\n\n  center() {\n    return new Point(this.x + (this.width / 2), this.y + (this.height / 2))\n  }\n\n  topEdge() { return new Line(this.topLeft(), this.topRight()); }\n\n  bottomEdge() { return new Line(this.bottomLeft(), this.bottomRight());  }\n\n  leftEdge() { return new Line(this.topLeft(), this.bottomLeft());  }\n\n  rightEdge() { return new Line(this.topRight(), this.bottomRight());  }\n\n  edges() {\n    return [this.topEdge(),\n        this.rightEdge(),\n        this.bottomEdge(),\n        this.leftEdge()];\n  }\n\n  allPoints() {\n    // take rectangle as discrete grid and return all points in the grid\n    // rect(3,4,2,3).allPoints() == [pt(3,4),pt(4,4),pt(3,5),pt(4,5),pt(3,6),pt(4,6)]\n    // if you want to convert points to indices use\n    // var w = 5, h = 7; rect(3,4,2,3).allPoints().map(function(p) { return p.y * w + p.x; }) == [23,24,28,29,33,34]\n    var x = this.x, y = this.y, w = this.width, h = this.height, points = [];\n    for (var j = y; j < y+h; j++)\n      for (var i = x; i < x+w; i++)\n        points.push(pt(i,j));\n    return points;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // testing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  isNonEmpty(rect) {\n    return this.width > 0 && this.height > 0;\n  }\n\n  containsRect(r) {\n    return this.x <= r.x && this.y <= r.y && r.maxX() <= this.maxX() && r.maxY() <= this.maxY();\n  }\n\n  intersects(r) {\n    return this.intersection(r).isNonEmpty();\n  }\n\n  containsPoint(p) {\n    return this.x <= p.x && p.x <= this.x + this.width && this.y <= p.y && p.y <= this.y + this.height;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // transforming\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  translatedBy(d) {\n    return new Rectangle(this.x + d.x, this.y + d.y, this.width, this.height);\n  }\n\n  scaleByRect(r) {\n    // r is a relative rect, as a pane spec in a window\n    return new Rectangle(\n    this.x + (r.x * this.width), this.y + (r.y * this.height), r.width * this.width, r.height * this.height);\n  }\n\n  scaleRectIn(fullRect) {\n    // return a relative rect for this as a part of fullRect\n    return new Rectangle((this.x - fullRect.x) / fullRect.width, (this.y - fullRect.y) / fullRect.height, this.width / fullRect.width, this.height / fullRect.height);\n  }\n  \n  scaleRectTo(fullRect) {\n    // scale the rect until it reaches the bounds of the full rect\n    var height, width, scale;\n    if (this.width > this.height) {\n      width = this.width;\n    } else {\n      height = this.height;\n    }\n    \n    if (width) {\n      scale = fullRect.width / width\n    } else {\n      scale = fullRect.height / height;\n    }\n    \n    return this.withExtent(this.extent().scaleBy(scale))\n               .withCenter(this.center());\n  }\n\n  scaleScalarFromRelativeOrigin(scale, origin) {\n    const absoluteOrigin = this.relativeToAbsPoint(origin);\n    return this.scaleScalarFromAbsOrigin(scale, absoluteOrigin)\n  }\n  scaleScalarFromAbsOrigin(scale, absoluteOrigin) {\n    const topLeft = this.topLeft().subPt(absoluteOrigin).scaleBy(scale).addPt(absoluteOrigin)\n    return new Rectangle(topLeft.x, topLeft.y, scale * this.width, scale * this.height)\n  }\n  \n  expandBy(delta) {\n    return this.insetBy(0 - delta);\n  }\n\n  translateForInclusion(other) {\n    var x = other.x,\n      y = other.y,\n      r = x + other.width,\n      b = y + other.height;\n    if (r > this.right()) x -= r - this.right();\n    if (b > this.bottom()) y -= b - this.bottom();\n    if (x < this.x) x = this.x;\n    if (y < this.y) y = this.y;\n    return rect(x,y, other.width, other.height);\n  }\n\n  transformRectForInclusion(other) {\n    var topLeft = this.topLeft().maxPt(other.topLeft()),\n      newBottomRight = topLeft.addPt(other.extent()),\n      innerBottomRight = this.bottomRight().minPt(newBottomRight);\n    return rect(topLeft, innerBottomRight);\n  }\n\n  insetByRect(r) {\n    return new Rectangle(this.x + r.left(), this.y + r.top(), this.width -\n        (r.left() + r.right()), this.height - (r.top() + r.bottom()));\n  }\n\n  outsetByRect(r) {\n    return new Rectangle(this.x - r.left(), this.y - r.top(), this.width +\n        (r.left() + r.right()), this.height + (r.top() + r.bottom()));\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // relations\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n  intersection(rect) {\n    var nx = Math.max(this.x, rect.x);\n    var ny = Math.max(this.y, rect.y);\n    var nw = Math.min(this.x + this.width, rect.x + rect.width) - nx;\n    var nh = Math.min(this.y + this.height, rect.y + rect.height) - ny;\n    return new Rectangle(nx, ny, nw, nh);\n  }\n\n  union(r) {\n    return rect(this.topLeft().minPt(r.topLeft()), this.bottomRight().maxPt(r.bottomRight()));\n  }\n\n  lineIntersection(line) {\n    return this.edges()\n      .map(function(edge) { return edge.intersection(line); })\n      .filter(ea => !!ea);\n  }\n\n  dist(rect) {\n    var p1 = this.closestPointToPt(rect.center());\n    var p2 = rect.closestPointToPt(p1);\n    return p1.dist(p2);\n  }\n\n  relativeToAbsPoint(relPt) {\n    return new Point(\n    this.x + this.width * relPt.x, this.y + this.height * relPt.y)\n  }\n\n  absToRelativePoint(absPt) {\n    return new Point((absPt.x - this.x) / this.width, (absPt.y - this.y) / this.height)\n  }\n\n  closestPointToPt(p) {\n    // Assume p lies outside me; return a point on my perimeter\n    return pt(Math.min(Math.max(this.x, p.x), this.maxX()), Math.min(Math.max(this.y, p.y), this.maxY()));\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // properties\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  maxX() {\n    return this.x + this.width;\n  }\n\n  maxY() {\n    return this.y + this.height;\n  }\n\n  realWidth() {\n    return this.x < 0 ? -this.x + this.width : this.width\n  }\n\n  realHeight() {\n    return this.y < 0 ? -this.y + this.height : this.height\n  }\n\n  area() { \n    const area = this.width * this.height,\n          sign = this.width < 0 && this.height < 0 ? -1 : 1; \n    return sign * area;\n  }\n\n  randomPoint() {\n    return Point.random(pt(this.width, this.height)).addPt(this.topLeft());\n  }\n\n  constrainPt(pt) {\n    return pt.maxPt(this.topLeft()).minPt(this.bottomRight());\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // SVG interface\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // modeled after the CSS box model: http://www.w3.org/TR/REC-CSS2/box.html\n  left() {\n    return this.x;\n  }\n\n  right() {\n    return this.maxX();\n  }\n\n  top() {\n    return this.y;\n  }\n\n  bottom() {\n    return this.maxY();\n  }\n\n  toInsetTuple() {\n    return [this.left(), this.top(), this.right(), this.bottom()];\n  }\n\n  toAttributeValue(d) {\n    var d = 0.01,\n      result = [this.left()];\n    if (this.top() === this.bottom() && this.left() === this.right()) {\n      if (this.top() === this.left()) result.push(this.top());\n      } else result = result.concat([this.top(), this.right(), this.bottom()]);\n      return result.invoke('roundTo', d || 0.01);\n  }\n\n  toLiteral() {\n    return {x: this.x, y: this.y, width: this.width, height: this.height};\n  }\n\n  // additions to the left,right,bottom,top shorthands, needed for layouting\n  centerX() {\n    return this.center().x\n  }\n\n  centerY() {\n    return this.center().y\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // part support\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  partNamed(partName) {\n    return this[partName].call(this);\n  }\n\n  withPartNamed(partName,newValue) {\n    return this[this.setterName(partName)].call(this, newValue);\n  }\n\n  setterName(partName) {\n    return \"with\" + partName[0].toUpperCase() + partName.slice(1);\n  }\n\n  partNameNear(partNames,p,dist) {\n    var partName = this.partNameNearest(partNames,p);\n    return (p.dist(this.partNamed(partName)) < dist) ? partName : null;\n  }\n\n  partNameNearest(partNames, p) {\n    var dist = 1.0e99,\n      partName = partNames[0];\n\n    for (var i=0; i<partNames.length; i++) {\n      var partName = partNames[i],\n        pDist = p.dist(this.partNamed(partName));\n      if (pDist < dist) {var nearest = partName; dist = pDist}\n    }\n\n    return nearest;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // printing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  toString() {\n    return \"rect(\" + this.x +\",\" + this.y + \",\" +this.width +\",\"+ this.height +\")\"\n  }\n  \n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // serialization\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // __serialize__() {\n  //   return {__expr__: this.toString(), bindings: {rect: \"lively.graphics/geometry-2d.js\"}}\n  // }\n}\n\n\nexport class Transform {\n\n  get exp() { return 0.0001; /*precision*/ }\n\n  constructor(translation, rotation, scale) {\n    // matrix is a duck with a,b,c,d,e,f, could be an SVG matrix or a\n    // Lively Transform\n    // alternatively, its a combination of translation rotation and scale\n    if (translation) {\n      if (translation.isPoint) {\n        var delta = translation,\n            angleInRadians = rotation || 0.0\n        if (scale === undefined) { scale = pt(1.0, 1.0); }\n        this.a = this.ensureNumber(scale.x * Math.cos(angleInRadians));\n        this.b = this.ensureNumber(scale.y * Math.sin(angleInRadians));\n        this.c = this.ensureNumber(scale.x * - Math.sin(angleInRadians));\n        this.d = this.ensureNumber(scale.y * Math.cos(angleInRadians));\n        this.e = this.ensureNumber(delta.x);\n        this.f = this.ensureNumber(delta.y);\n\n        // avoid inaccurate translations in Chrome\n        if (this.a > 1) this.a = Math.round(this.a*Math.pow(10,2))/Math.pow(10,2);\n        if (this.d > 1) this.d = Math.round(this.d*Math.pow(10,2))/Math.pow(10,2);\n      } else {\n        this.fromMatrix(translation);\n      }\n    } else {\n      this.a = this.d = 1.0;\n      this.b = this.c = this.e = this.f = 0.0;\n    }\n  }\n\n  get isTransform() { return true }\n\n  copy() { return new Transform(this); }\n\n  fromMatrix(mx) {\n    this.a = this.ensureNumber(mx.a);\n    this.b = this.ensureNumber(mx.b);\n    this.c = this.ensureNumber(mx.c);\n    this.d = this.ensureNumber(mx.d);\n    this.e = this.ensureNumber(mx.e);\n    this.f = this.ensureNumber(mx.f);\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // accessing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  \n  // getRotation() { // in degrees\n  //   // Note the ambiguity with negative scales is resolved by assuming\n  //   // scale x is positive\n  //   var r = num.toDegrees(Math.atan2(-this.c, this.a));\n\n  //   // don't bother with values very close to 0\n  //   return Math.abs(r) < this.eps ? 0 : r;\n  // }\n\n  getScale() {\n    // Note the ambiguity with negative scales and rotation is resolved by assuming scale x is positive\n    var a = this.a, c = this.c, s = Math.sqrt(a * a + c * c);\n\n    // don't bother with values very close to 1\n    return Math.abs(s - 1) < this.eps ? 1 : s;\n  }\n\n  getScalePoint() {\n    // Note the ambiguity with negative scales and rotation is resolved by\n    // assuming scale x is positive\n    var a = this.a,\n      b = this.b,\n      c = this.c,\n      d = this.d,\n      sx = Math.sqrt(a * a + c * c),\n      r =   Math.atan2(-c, a), // radians\n      // avoid div by 0\n      sy = (Math.abs(b) > Math.abs(d)) ? b / Math.sin(r) : d / Math.cos(r);\n    return pt(sx, sy);\n  }\n\n  getTranslation() { return pt(this.e, this.f); }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // testing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  isTranslation() {\n    // as specified in:\n    // http://www.w3.org/TR/SVG11/coords.html#InterfaceSVGTransform\n    return (this.a==1 && this.b==0 && this.c==0 && this.d==1)\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // converting\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  toSVGAttributeValue() {\n    var delta = this.getTranslation(),\n      attr = \"translate(\" + delta.x + \",\" + delta.y +\")\",\n      theta = this.getRotation(),\n      sp = this.getScalePoint();\n\n    if (theta != 0.0) attr += \" rotate(\" + this.getRotation()  +\")\"; // in degrees\n    if (sp.x != 1.0 || sp.y != 1.0)   attr += \" scale(\" + sp.x + \",\" + sp.y + \")\";\n\n    return attr;\n  }\n\n  toCSSValue(bounds) {\n    var attr = '', delta = this.getTranslation();\n\n    attr += \"translate(\" + delta.x.toFixed(2) + \"px,\" + delta.y.toFixed(2) +\"px)\";\n\n    if (bounds) {\n      // FIXME this is to fix the rotation...!\n      var offsetX = bounds.width / 2;\n      var offsetY = bounds.height / 2;\n      attr += \" translate(\" + offsetX.toFixed(2) + \"px,\" + offsetY.toFixed(2) +\"px)\";\n    }\n\n    var theta = this.getRotation();\n    if (theta != 0.0) attr += \" rotate(\"\n        + this.getRotation().toFixed(2) +\"deg)\";\n\n    if (bounds) {\n      // FIXME this is to fix the rotation...!\n      var offsetX = bounds.width / 2;\n      var offsetY = bounds.height / 2;\n      attr += \" translate(\" + (offsetX * -1).toFixed(2) + \"px,\" + (offsetY * -1).toFixed(2) +\"px)\";\n    }\n\n    var sp = this.getScalePoint();\n    if (sp.x != 1.0 || sp.y != 1.0) {\n      attr += \" scale(\" + sp.x.toFixed(2) + \",\" + sp.y.toFixed(2) + \")\";\n    }\n\n    return attr;\n  }\n\n  toCSSTransformString() {\n    var rot = this.getRotation(), scale = this.getScale();\n    return `translate(${this.e}px,${this.f}px) rotate(${rot}deg) scale(${scale},${scale})`;\n  }\n\n  toString() { return this.toCSSTransformString(); }\n\n  toMatrix() { return this.copy(); }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // transforming\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  transformPoint(p, acc) { return p.matrixTransform(this, acc); }\n\n  transformDirection(p, acc) {\n    return p.matrixTransformDirection(this, acc);\n  }\n\n  matrixTransformForMinMax(pt, minPt, maxPt) {\n    var x = this.a * pt.x + this.c * pt.y + this.e,\n      y = this.b * pt.x + this.d * pt.y + this.f;\n    if (x > maxPt.x) maxPt.x = x;\n    if (y > maxPt.y) maxPt.y = y;\n    if (x < minPt.x) minPt.x = x;\n    if (y < minPt.y) minPt.y = y;\n  }\n\n  transformRectToRect(r) {\n    var minPt = pt(Infinity, Infinity),\n      maxPt = pt(-Infinity, -Infinity);\n    this.matrixTransformForMinMax(r.topLeft(), minPt, maxPt);\n    this.matrixTransformForMinMax(r.bottomRight(), minPt, maxPt);\n    if (this.isTranslation()) return rect(minPt, maxPt);\n\n    this.matrixTransformForMinMax(r.topRight(), minPt, maxPt);\n    this.matrixTransformForMinMax(r.bottomLeft(), minPt, maxPt);\n    return rect(minPt, maxPt);\n  }\n\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // matrix operations\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  preConcatenate(t) {\n    var m = this.matrix_ || this.toMatrix();\n    this.a =  t.a * m.a + t.c * m.b;\n    this.b =  t.b * m.a + t.d * m.b;\n    this.c =  t.a * m.c + t.c * m.d;\n    this.d =  t.b * m.c + t.d * m.d;\n    this.e =  t.a * m.e + t.c * m.f + t.e;\n    this.f =  t.b * m.e + t.d * m.f + t.f;\n    this.matrix_ = this.toMatrix();\n    return this;\n  }\n\n  invert() {\n    var m = this.copy();\n\n    var det = m.a * m.d - m.c * m.b,\n      invdet = 1/det;\n\n    this.a =  m.d * invdet;\n    this.b = -m.b * invdet;\n    this.c = -m.c * invdet;\n    this.d =  m.a * invdet;\n    this.e =  (m.c * m.f - m.e * m.d) * invdet;\n    this.f = -(m.a * m.f - m.b * m.e) * invdet;\n\n    return this;\n  }\n\n  inverse() {\n    var matrix = this.matrix_ || this.toMatrix();\n    var result = new this.constructor(matrix);\n    result.invert();\n    return result;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // helper\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  ensureNumber(value) {\n    // note that if a,b,.. f are not numbers, it's usually a\n    // problem, which may crash browsers (like Safari) that don't\n    // do good typechecking of SVGMatrix properties\n    if (isNaN(value)) { throw new Error('not a number');}\n    return value;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // serialization\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // __serialize__() {\n  //   return {\n  //     __expr__: `new Transform({a: ${this.a}, b: ${this.b}, c: ${this.c}, d: ${this.d}, e: ${this.e}, f: ${this.f}})`,\n  //     bindings: {Transform: \"lively.graphics/geometry-2d.js\"}\n  //   }\n  // }\n\n}\n\nexport class Line {\n\n  static fromCoords(startX, startY, endX, endY) {\n    return new Line(pt(startX, startY), pt(endX, endY));\n  }\n\n  constructor(start, end) {\n    this.start = start;\n    this.end = end;\n  }\n\n  get isLine() { return true }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // accessing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  sampleN(n) {\n    // return n points that are collinear with this and are between\n    // this.start and this.end\n    n = n || 10;\n    var vector = this.end.subPt(this.start),\n      stepPt = vector.scaleBy(1/n),\n      result = [];\n    for (var i = 0; i <= n; i++) {\n      result.push(this.start.addPt(stepPt.scaleBy(i)))\n    }\n    return result;\n  }\n\n  sample(length) {\n    return this.sampleN(this.length() / length);\n  }\n\n  length() {\n    return this.start.dist(this.end);\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // testing\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  equals(otherLine) {\n    if (!otherLine) return false;\n    return this.start.eqPt(otherLine.start) && this.end.eqPt(otherLine.end);\n  }\n\n  includesPoint(p, unconstrained) {\n    // test whether p is collinear with this.start, this.end\n    // constrained: p also needs to be on segment between start, end\n    var x1 = this.start.x,\n      y1 = this.start.y,\n      x2 = this.end.x,\n      y2 = this.end.y,\n      x3 = p.x,\n      y3 = p.y,\n      collinear = ((x2 - x1) * (y3 - y1)) - ((x3 - x1) * (y2 - y1)) === 0;\n    if (unconstrained || !collinear) return collinear;\n    var xMin = Math.min(x1, x2),\n        yMin = Math.min(y1, y2),\n        xMax = Math.max(x1, x2),\n        yMax = Math.max(y1, y2);\n    return xMin <= x3 && x3 <= xMax && yMin < y3 && y3 <= yMax;\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // intersection\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n    intersection(otherLine, constrained=true) {\n    // returns true if the line from (a,b)->(c,d) intersects with (p,q)->(r,s)\n  // https://stackoverflow.com/questions/9043805/test-if-two-lines-intersect-javascript-function\n       //       .. (x1, y1)\n    //         ..              ..... (x4,y4)\n    //           ..    ........\n    // (x3,y3) .....X..\n    //    .....      ..\n    //                 ..  (x2, y2)\n    var eps = 0.0001,\n        start1 = this.start,\n        end1 = this.end,\n        start2 = otherLine.start,\n        end2 = otherLine.end,\n        x1 = start1.x,\n        y1 = start1.y,\n        x2 = end1.x,\n        y2 = end1.y,\n        x3 = start2.x,\n        y3 = start2.y,\n        x4 = end2.x,\n        y4 = end2.y;\n\n    var x = ((x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4)) /\n            ((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4)),\n        y = ((x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4)) /\n            ((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4));\n\n    // are lines parallel?\n    if (x === Infinity || y === Infinity) return null;\n\n     function between (x, a, b, eps) {\n      eps = eps || 0;\n      let min, max;\n      if (a < b) { min = a, max = b; } else { max = a, min = b; }\n      return (max - x + eps >= 0) && (min - x - eps <= 0);\n    }\n  \n    if (constrained) {\n      if (!between(x, x1, x2, eps)\n      ||  !between(y, y1, y2, eps)\n      ||  !between(x, x3, x4, eps)\n      ||  !between(y, y3, y4, eps)) return null;\n    }\n\n    return pt(x,y);\n  }\n \n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // debugging\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  toString() {\n    return 'Line((' + this.start.x + ',' + this.start.y +'), ('+ this.end.x+','+this.end.y+'))'\n\n    // return string.format('Line((%s,%s), (%s,%s))',\n    //             this.start.x, this.start.y,\n    //             this.end.x, this.end.y)\n  }\n\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // serialization\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // __serialize__() {\n  //   return {\n  //     __expr__: `Line.fromCoords(${this.start.x}, ${this.start.y}, ${this.end.x}, ${this.end.y})`,\n  //     bindings: {Line: \"lively.graphics/geometry-2d.js\"}\n  //   }\n  // }\n\n}\n\nexport function rect(arg1, arg2, arg3, arg4) {\n  // arg1 and arg2 can be location and corner or\n  // arg1/arg2 = location x/y and arg3/arg4 = extent x/y\n  var x, y, w, h;\n  if (typeof arg1 === 'number') {\n    x = arg1, y = arg2, w = arg3, h = arg4\n  } else {\n    x = arg1.x; y = arg1.y;\n    w = arg2.x - x; h = arg2.y - y;\n  }\n  return new Rectangle(x, y, w, h);\n}\n\nexport function pt(x, y) { return new Point(x, y); }\n"]}