【问题标题】:Pie chart slice - center of mass饼图切片 - 质心
【发布时间】:2018-05-29 22:09:37
【问题描述】:

使用 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

【问题讨论】:

  • 一般情况下看起来是一个相当复杂的问题。也许您可以将切片减少为解决方案似乎更简单的三角形(找到三角形内接的矩形)。此外,蛮力解决方案(检查沿切片的所有点的矩形并找到最佳拟合)可能足够快。

标签: javascript math highcharts pie-chart


【解决方案1】:

根据Wikipedia,圆扇形的质心到圆心的距离是(2r * sin(a)) / (3 * a)。我会像这样找到posXposY

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

【讨论】:

  • 感谢您的链接 - 我不知道要搜索什么术语。您的代码似乎不起作用。我已经用截图更新了这个问题。我承认我不知道三角函数如何适合公式。
  • 我现在明白三角函数是如何适应的 - 但我仍然不确定为什么结果如此不稳定。
  • 让我们检查一下数学:对于全角 60 度的扇区,半角是 30 度 = Pi/6。 dist = 2 * r * sin(Pi/6)/(3* Pi/6) = r * 2/Pi ~ 0.63 * r 但是你的“次要”部门的第二张图片显示的范围很小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多