You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.3 KiB
59 lines
1.3 KiB
export default function PathString() { |
|
this._string = []; |
|
} |
|
|
|
PathString.prototype = { |
|
_radius: 4.5, |
|
_circle: circle(4.5), |
|
pointRadius: function(_) { |
|
if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; |
|
return this; |
|
}, |
|
polygonStart: function() { |
|
this._line = 0; |
|
}, |
|
polygonEnd: function() { |
|
this._line = NaN; |
|
}, |
|
lineStart: function() { |
|
this._point = 0; |
|
}, |
|
lineEnd: function() { |
|
if (this._line === 0) this._string.push("Z"); |
|
this._point = NaN; |
|
}, |
|
point: function(x, y) { |
|
switch (this._point) { |
|
case 0: { |
|
this._string.push("M", x, ",", y); |
|
this._point = 1; |
|
break; |
|
} |
|
case 1: { |
|
this._string.push("L", x, ",", y); |
|
break; |
|
} |
|
default: { |
|
if (this._circle == null) this._circle = circle(this._radius); |
|
this._string.push("M", x, ",", y, this._circle); |
|
break; |
|
} |
|
} |
|
}, |
|
result: function() { |
|
if (this._string.length) { |
|
var result = this._string.join(""); |
|
this._string = []; |
|
return result; |
|
} else { |
|
return null; |
|
} |
|
} |
|
}; |
|
|
|
function circle(radius) { |
|
return "m0," + radius |
|
+ "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius |
|
+ "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius |
|
+ "z"; |
|
}
|
|
|