+ var getLengthFactory = function (istotal) {
+ return function (length) {
+ if (this.type != "path") {
+ return -1;
+ }
+ var path = path2curve(this.attrs.path), x, y, p, l,
+ len = 0;
+ for (var i = 0, ii = path.length; i < ii; i++) {
+ p = path[i];
+ if (p[0] == "M") {
+ x = +p[1];
+ y = +p[2];
+ } else {
+ l = segmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
+ if (!istotal && len + l > length) {
+ return R.findDotsAtSegment(x, y, p[1], p[2], p[3], p[4], p[5], p[6], (length - len) / l);
+ }
+ len += l;
+ x = +p[5];
+ y = +p[6];
+ }
+ }
+ return istotal ? len : R.findDotsAtSegment(x, y, p[1], p[2], p[3], p[4], p[5], p[6], 1);
+ };
+ },
+ segmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
+ var old = {x: 0, y: 0},
+ len = 0;
+ for (var i = 0; i < 1.01; i+=.01) {
+ var dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i);
+ i && (len += math.sqrt(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2)));
+ old = dot;
+ }
+ return len;
+ };
+ Element[proto].getTotalLength = getLengthFactory(1);
+ Element[proto].getPointAtLength = getLengthFactory();