Срез круговой диаграммы - центр масс - PullRequest
0 голосов
/ 30 мая 2018

Используя Highcharts, я пытаюсь расположить прямоугольные элементы над «центром масс» среза круговой диаграммы.

У меня есть формула / алгоритм для нахождения центра среза:

shapeArgs = Chart.series[0].points[sliceIndex].shapeArgs,
ang       = (shapeArgs.end - shapeArgs.start) / 2 + shapeArgs.start,
posX      = cX + shapeArgs.r/2 * Math.cos(ang),
posY      = cY + shapeArgs.r/2 * Math.sin(ang)

Находит центр среза на основе начального и конечного углов, а также радиус диаграммы, представленный черным кружком на изображении ниже.То, что я хочу, - это какой-то способ найти центр самого большого прямоугольника, который поместится в срез - представлен зеленым кружком внизу (который я только что сглазил).Я рассуждаю так, что элемент, расположенный над центром масс среза, будет лучше вписываться в срез, чем что-то, расположенное в точном центре.[! [введите описание изображения здесь] [1]] [1]

Мое элементарное исправление заключалось в уменьшении коэффициента уменьшения радиуса:

posX = cX + shapeArgs.r/1.3 * Math.cos(ang)

Что, похоже, работаетдовольно хорошо, но мне интересно, есть ли лучший способ.Кто-нибудь знает математику для этого?

Редактировать:

Снимок экрана результата настройки коэффициента: https://i.stack.imgur.com/FBH5p.png
Снимок экрана результата выполненияВикипедия математика: https://i.stack.imgur.com/DlGcS.png

1 Ответ

0 голосов
/ 30 мая 2018

Согласно Википедии расстояние центра масс кругового сектора от центра составляет (2r * sin (a)) / (3 * a).Я бы нашел posX и posY вот так:

var dist = (2 * shapeArgs.r * Math.sin(ang)) / (3 * ang);
posX = cX + dist * Math.cos(ang);
posY = cY + dist * Math.sin(ang);
...