{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/client/graphics.js"],"names":["rect","arg1","arg2","arg3","arg4","x","y","w","h","Rectangle","pt","Point","ensure","duck","polar","r","theta","Math","cos","sin","fromLiteral","literal","fromTuple","tuple","constructor","isPoint","getX","getY","toFixed","val","addPt","p","addXY","dx","dy","midPt","subPt","subXY","scaleBy","scaleX","scaleYOrUndefined","scaleByPt","scalePt","negated","inverted","invertedSafely","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","nearestPointOnLineBetween","p1","p2","x1","y1","x21","y21","t","i","atan2","asRectangle","extent","ext","extentAsRectangle","lineTo","end","Line","toTuple","toLiteral","toString","inspect","JSON","stringify","fromAny","ptA","ptB","width","height","unionPts","points","length","inset","left","top","right","bottom","undefined","corners","sides","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","other","maxX","maxY","leftCenter","rightCenter","topCenter","bottomCenter","topEdge","bottomEdge","leftEdge","rightEdge","edges","allPoints","j","push","isNonEmpty","containsRect","intersects","intersection","containsPoint","translatedBy","scaleByRect","scaleRectIn","fullRect","scaleRectTo","scale","expandBy","delta","translateForInclusion","transformRectForInclusion","newBottomRight","innerBottomRight","insetByRect","outsetByRect","nx","ny","nw","nh","union","line","edge","filter","ea","closestPointToPt","relativeToAbsPoint","relPt","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","abs","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"],"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 var Point = 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  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  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\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  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  // 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  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // serialization\n  // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n  // __serialize__() {\n  //   return {__expr__: this.toString(), bindings: {pt: \"lively.graphics/geometry-2d.js\"}}\n  // }\n}\n\n\nexport var Rectangle = 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  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  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 instanceof Point) {\n        var delta = translation,\n            angleInRadians = rotation || 0.0,\n            scale = scale;\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, unconstrained) {\n  //   // constrained: intersection has to be between start/ends of this and\n  //   // otherLine\n  //   // http://en.wikipedia.org/wiki/Line-line_intersection\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  //   if (!unconstrained) {\n  //     if (!num.between(x, x1, x2, eps)\n  //     ||  !num.between(y, y1, y2, eps)\n  //     ||  !num.between(x, x3, x4, eps)\n  //     ||  !num.between(y, y3, y4, eps)) return null;\n  //   }\n\n  //   return pt(x,y);\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"]}