Предположительно, если я знаю innerRadius
для дуги (которая будет одинаковой длины для A и B), я могу построить воображаемый треугольник и использовать закон косинусов
c2 = a2+ b2 - 2ab cos C
Но мне нужен угол C
.Это можно получить в D3, получив разницу в начальном и конечном углах.
var x = d3.scaleLinear()
.range([0, 2 * Math.PI])
.clamp(true);
var y = d3.scaleLinear()
.range([0, this.radius])
.clamp(true);
var.arc = d3.arc()
.startAngle(function(d) {
return x(d.x0);
})
.endAngle(function(d) {
return x(d.x1);
});
function getRingRadius() {
// for example
return 50;
}
function measureSegment(d) {
var a = getRingRadius() * (d.depth || 0), b = a;
var C = arc.startAngle()(d) - arc.endAngle()(d);
return Math.sqrt((a*a + b*b) - 2*a*b*Math.cos(C));
}