-
Notifications
You must be signed in to change notification settings - Fork 3
/
canvas-arrow.js
31 lines (31 loc) · 998 Bytes
/
canvas-arrow.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(function(target) {
if (!target || !target.prototype)
return;
target.prototype.arrow = function(startX, startY, endX, endY, controlPoints) {
var dx = endX - startX;
var dy = endY - startY;
var len = Math.sqrt(dx * dx + dy * dy);
var sin = dy / len;
var cos = dx / len;
var a = [];
a.push(0, 0);
for (var i = 0; i < controlPoints.length; i += 2) {
var x = controlPoints[i];
var y = controlPoints[i + 1];
a.push(x < 0 ? len + x : x, y);
}
a.push(len, 0);
for (var i = controlPoints.length; i > 0; i -= 2) {
var x = controlPoints[i - 2];
var y = controlPoints[i - 1];
a.push(x < 0 ? len + x : x, -y);
}
a.push(0, 0);
for (var i = 0; i < a.length; i += 2) {
var x = a[i] * cos - a[i + 1] * sin + startX;
var y = a[i] * sin + a[i + 1] * cos + startY;
if (i === 0) this.moveTo(x, y);
else this.lineTo(x, y);
}
};
})(CanvasRenderingContext2D);