Как найти центроид среза дуги, когда срез не начинается с угла 0?

Я пытаюсь найти центроид каждого фрагмента в круговой диаграмме. Предполагая, что центр круга является источником, как я могу вычислить координаты x и y центроида каждого среза?

У меня есть радиус, угол начала и конечный угол каждого среза.

Я знаю, как вычислить центроид среза, когда начальный угол этого среза равен 0; это ответит здесь. Но это предполагает, что у вас есть угол альфа среза, начиная с 0 (который, по мнению JavaScript, является местом, которое обычно считается pi / 2). Я хочу, чтобы координаты, например, центроида красного фрагмента на этой фотографии:

круговая диаграмма,

Скажем, угол альфа красного среза равен 1 радиан (для простоты, startAngle = 6 и endAngle = 5, это не точно, но близко к фактическим углам на фотографии), а радиус диаграммы составляет 400 пикселей. Используя формулу, xbar = (2/3) (r / a) sin (a) = (2/3) (400/1) (.84147) = 224.39226px, которая будет ~ 225px справа от начала координат, нигде рядом с фактической координатой х центроида, потому что формула предполагает, что начальный угол среза равен 0.

Кроме того, отправной точкой являются координаты pi / 2, а не 0, могут внести свой вклад в проблему? Я не уверен.

Как найти фактическую координату х центроида?

javascript,geometry,pie-chart,

1

Ответов: 1


1 принят

Благодаря замечанию Бена Уэста, я смог определить ответ. Вы должны повернуть точку вокруг центральной точки круга startAngleрадиан.

Также обратите внимание, если вы используете JavaScript, чтобы круг начинался с pi / 2 и вращался по часовой стрелке вместо против часовой стрелки, как функции sin и cos, поэтому вы должны это учитывать.

Код:

computeCentroid(slice, chart) {
    const startAngle = slice.startAngle - (Math.PI / 2), endAngle = slice.endAngle - (Math.PI / 2);
    const alpha = endAngle - startAngle;
    const radius = chart.radius;

    // get coordinates of centroid if startAngle = 0
    const xbar = (2 / 3) * (radius / alpha) * Math.sin(alpha);
    const ybar = (-2 / 3) * (radius / alpha) * (Math.cos(alpha) - 1);

    // rotate coordinates about (0, 0) by startAngle
    const xCoord = xbar * Math.cos(startAngle) - ybar * Math.sin(startAngle);
    const yCoord = ybar * Math.cos(startAngle) + xbar * Math.sin(startAngle);

    return [xCoord, yCoord];
}
JavaScript, геометрия, круговая диаграмма,
Похожие вопросы
Яндекс.Метрика