81 lines
2.6 KiB
JavaScript
81 lines
2.6 KiB
JavaScript
|
d3.hive = {};
|
||
|
|
||
|
d3.hive.link = function() {
|
||
|
var source = function(d) { return d.source; },
|
||
|
target = function(d) { return d.target; },
|
||
|
angle = function(d) { return d.angle; },
|
||
|
startRadius = function(d) { return d.radius; },
|
||
|
endRadius = startRadius,
|
||
|
arcOffset = -Math.PI / 2;
|
||
|
|
||
|
function link(d, i) {
|
||
|
var s = node(source, this, d, i),
|
||
|
t = node(target, this, d, i),
|
||
|
x;
|
||
|
if (t.a < s.a) x = t, t = s, s = x;
|
||
|
if (t.a - s.a > Math.PI) s.a += 2 * Math.PI;
|
||
|
var a1 = s.a + (t.a - s.a) / 3,
|
||
|
a2 = t.a - (t.a - s.a) / 3;
|
||
|
return s.r0 - s.r1 || t.r0 - t.r1
|
||
|
? "M" + Math.cos(s.a) * s.r0 + "," + Math.sin(s.a) * s.r0
|
||
|
+ "L" + Math.cos(s.a) * s.r1 + "," + Math.sin(s.a) * s.r1
|
||
|
+ "C" + Math.cos(a1) * s.r1 + "," + Math.sin(a1) * s.r1
|
||
|
+ " " + Math.cos(a2) * t.r1 + "," + Math.sin(a2) * t.r1
|
||
|
+ " " + Math.cos(t.a) * t.r1 + "," + Math.sin(t.a) * t.r1
|
||
|
+ "L" + Math.cos(t.a) * t.r0 + "," + Math.sin(t.a) * t.r0
|
||
|
+ "C" + Math.cos(a2) * t.r0 + "," + Math.sin(a2) * t.r0
|
||
|
+ " " + Math.cos(a1) * s.r0 + "," + Math.sin(a1) * s.r0
|
||
|
+ " " + Math.cos(s.a) * s.r0 + "," + Math.sin(s.a) * s.r0
|
||
|
: "M" + Math.cos(s.a) * s.r0 + "," + Math.sin(s.a) * s.r0
|
||
|
+ "C" + Math.cos(a1) * s.r1 + "," + Math.sin(a1) * s.r1
|
||
|
+ " " + Math.cos(a2) * t.r1 + "," + Math.sin(a2) * t.r1
|
||
|
+ " " + Math.cos(t.a) * t.r1 + "," + Math.sin(t.a) * t.r1;
|
||
|
}
|
||
|
|
||
|
function node(method, thiz, d, i) {
|
||
|
var node = method.call(thiz, d, i),
|
||
|
a = +(typeof angle === "function" ? angle.call(thiz, node, i) : angle) + arcOffset,
|
||
|
r0 = +(typeof startRadius === "function" ? startRadius.call(thiz, node, i) : startRadius),
|
||
|
r1 = (startRadius === endRadius ? r0 : +(typeof endRadius === "function" ? endRadius.call(thiz, node, i) : endRadius));
|
||
|
return {r0: r0, r1: r1, a: a};
|
||
|
}
|
||
|
|
||
|
link.source = function(_) {
|
||
|
if (!arguments.length) return source;
|
||
|
source = _;
|
||
|
return link;
|
||
|
};
|
||
|
|
||
|
link.target = function(_) {
|
||
|
if (!arguments.length) return target;
|
||
|
target = _;
|
||
|
return link;
|
||
|
};
|
||
|
|
||
|
link.angle = function(_) {
|
||
|
if (!arguments.length) return angle;
|
||
|
angle = _;
|
||
|
return link;
|
||
|
};
|
||
|
|
||
|
link.radius = function(_) {
|
||
|
if (!arguments.length) return startRadius;
|
||
|
startRadius = endRadius = _;
|
||
|
return link;
|
||
|
};
|
||
|
|
||
|
link.startRadius = function(_) {
|
||
|
if (!arguments.length) return startRadius;
|
||
|
startRadius = _;
|
||
|
return link;
|
||
|
};
|
||
|
|
||
|
link.endRadius = function(_) {
|
||
|
if (!arguments.length) return endRadius;
|
||
|
endRadius = _;
|
||
|
return link;
|
||
|
};
|
||
|
|
||
|
return link;
|
||
|
};
|