C 甜甜圈图:检测哪个切片包含点的更快方法

C 甜甜圈图:检测哪个切片包含点的更快方法,c,charts,C,Charts,我有一个油炸圈饼图,我想知道哪个切片包含蓝点(检测点击): 我正在使用的库不能做到这一点(也不能做到开箱即用,所以我已经实现了这一点) 如果有的话,我更喜欢一些很酷的主意。这些参数很容易获得: 图表的中心(也是圆环的中心) 内外圆半径 资料 这些参数不可用或不容易获得: 切片的坐标 我知道这可以通过一些简单的sin和cos函数来实现,但是,考虑到点的坐标x(水平,向右正)和y(垂直,向上正),还有什么“更明智”的方法吗 减去圆心的坐标。(为了简单起见,我将在减法后为新坐标重用标签x和

我有一个油炸圈饼图,我想知道哪个切片包含蓝点(检测点击):

我正在使用的库不能做到这一点(也不能做到开箱即用,所以我已经实现了这一点)

如果有的话,我更喜欢一些很酷的主意。这些参数很容易获得:

  • 图表的中心(也是圆环的中心)
  • 内外圆半径
  • 资料
这些参数不可用或不容易获得:

  • 切片的坐标
我知道这可以通过一些简单的
sin
cos
函数来实现,但是,考虑到点的坐标x(水平,向右正)和y(垂直,向上正),还有什么“更明智”的方法吗

  • 减去圆心的坐标。(为了简单起见,我将在减法后为新坐标重用标签x和y。)
  • 如果x2+y2小于内半径的平方或大于外半径的平方,则点不在带内。(请注意,浮点运算中的舍入问题可能会导致此确定稍微偏离。如果您关心高精度,则需要进一步的工作。)
  • 否则,
    atan2(x,y)
    给出从圆顶到圆点的顺时针角度(弧度)。(注意
    atan2
    通常使用参数
    atan2(y,x)
    编写,但这给出了与水平x轴逆时针的角度。我将它们交换为所需的方向。)
  • 除以2π(
    2*M_PI
    ,定义见
    )给出的角度是圆的一部分(0到1),但如果圆点位于左侧,则角度为负值。如果为负数,则添加1

然后可以将该角度与数据进行比较,以确定它位于哪个切片中。(如果角度恰好位于切片边界上,请注意要做什么,包括角度是否正好为0或1。)

正反方向有什么问题?对我来说,使用它们听起来很“明智”。如果切片的坐标不可用,那么可用的是什么?相应的角度?每个切片的相对重量?注意,点<代码> x,y < /代码>的角度很容易用<代码> ATAN2(y,x)< /> >计算。如果知道每个片的权重,可以计算每个片的打开和最后角,然后使用点的角度。选择一种语言来询问,C或C++,并删除另一个标签。