Расчет длины дуги в D3 - PullRequest
0 голосов
/ 05 июля 2019

Я работаю с графиком солнечных лучей в D3 и мне нужно вычислить ширину любого данного сегмента.На диаграмме ниже, как я могу получить фактическую ширину в пикселях линии AB для Arc1?

enter image description here

1 Ответ

1 голос
/ 05 июля 2019

Предположительно, если я знаю 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));
}
...