SVG.Point = SVG.invent({ // Initialize create: function(x,y) { var i, source, base = {x:0, y:0} // ensure source as object source = Array.isArray(x) ? {x:x[0], y:x[1]} : typeof x === 'object' ? {x:x.x, y:x.y} : x != null ? {x:x, y:(y != null ? y : x)} : base // If y has no value, then x is used has its value // merge source this.x = source.x this.y = source.y } // Add methods , extend: { // Clone point clone: function() { return new SVG.Point(this) } // Morph one point into another , morph: function(x, y) { // store new destination this.destination = new SVG.Point(x, y) return this } // Get morphed point at a given position , at: function(pos) { // make sure a destination is defined if (!this.destination) return this // calculate morphed matrix at a given position var point = new SVG.Point({ x: this.x + (this.destination.x - this.x) * pos , y: this.y + (this.destination.y - this.y) * pos }) return point } // Convert to native SVGPoint , native: function() { // create new point var point = SVG.parser.native.createSVGPoint() // update with current values point.x = this.x point.y = this.y return point } // transform point with matrix , transform: function(matrix) { return new SVG.Point(this.native().matrixTransform(matrix.native())) } } }) SVG.extend(SVG.Element, { // Get point point: function(x, y) { return new SVG.Point(x,y).transform(this.screenCTM().inverse()); } })