73 lines
1.7 KiB
JavaScript
73 lines
1.7 KiB
JavaScript
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());
|
|
}
|
|
|
|
})
|