Как найти центр тяжести дуги, если срез не начинается под углом 0? - PullRequest
0 голосов
/ 29 июня 2018

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

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

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

pie chart.

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

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

Как узнать фактическую координату x центроида?

1 Ответ

0 голосов
/ 29 июня 2018

Благодаря комментарию Бена Уэста я смог определить ответ. Вы должны повернуть точку вокруг центральной точки круга 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];
}
...