{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/src/client/graphics.js"],"names":["Point","ensure","duck","x","y","polar","r","theta","Math","cos","sin","fromLiteral","literal","pt","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","rect","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"]}