{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eventsourcing/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","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","Rectangle","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","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","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","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 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"]}