/** Class for drawing polylines. @namespace ludo.canvas @class ludo.svg.Polyline @augments canvas.NamedNode @param {String} points @param {canvas.NodeConfig} config @example var polyline = new ludo.svg.Polyline('20,20 40,25 60,40 80,120 120,140 200,180'); */ ludo.svg.Polyline = new Class({ Extends: ludo.svg.NamedNode, tagName : 'polyline', pointString : '', pointArray : undefined, size:undefined, position:undefined, initialize:function(points, properties){ properties = properties || {}; properties.points = points; this.parent(properties); this.pointString = points; }, /** * Return x and y of a point * @function getPoint * @param {Number} index * @return {Object|undefined} x and y * @memberof ludo.svg.Polyline.prototype */ getPoint:function(index){ if(this.pointArray === undefined)this.buildPointArray(); index *=2; if(index > this.pointArray.length-2)return undefined; return { x : this.pointArray[index], y : this.pointArray[index+1] } }, /** Set new x and y for one of the points. @function setPoint @param {Number} index @param {Number} x @param {Number} y @memberof ludo.svg.Polyline.prototype @example var polyline = new ludo.svg.Polyline('20,20 40,25 60,40 80,120 120,140 200,180'); polyline.setPoint(0,10,5); polyline.setPoint(1,120,40); will change the points to @example '10,5 120,40 60,40 80,120 120,140 200,180' */ setPoint:function(index, x, y){ if(this.pointArray === undefined)this.buildPointArray(); index *=2; if(index > this.pointArray.length-2)return; this.pointArray[index] = x; this.pointArray[index+1] = y; this.set('points', this.pointArray.join(' ')); this.size = undefined; this.position = undefined; }, buildPointArray:function(){ var points = this.pointString.replace(/,/g,' '); points = points.replace(/\s+/g,' '); this.pointArray = points.split(/\s/g); }, /** * Get size of polyline (max X - min X) and (max X - min Y) * @function getSize * @return {Object} x and y * @memberof ludo.svg.Polyline.prototype */ getSize:function(){ if(this.size === undefined){ var minMax = this.getMinAndMax(); this.size = { x : Math.abs(minMax.maxX - minMax.minX), y : Math.abs(minMax.maxY - minMax.minY) }; } return this.size; }, /** * Get position of polyline, min X and min Y) * @function getPosition * @return {Object} x and y * @memberof ludo.svg.Polyline.prototype */ getPosition:function(){ if(this.position === undefined){ var minMax = this.getMinAndMax(); this.position = { x : minMax.minX, y : minMax.minY }; } return this.position; }, getMinAndMax:function(){ if(this.pointArray === undefined)this.buildPointArray(); var p = this.pointArray; var minX = 10000, maxX = -100000; var minY = 10000, maxY = -100000; for(var i=0;i< p.length;i+=2){ minX = Math.min(minX, p[i]); maxX = Math.max(maxX, p[i]); minY = Math.min(minY, p[i+1]); maxY = Math.max(maxY, p[i+1]); } return { minX: minX, minY: minY, maxX: maxX, maxY: maxY } } });