0

我画了一个圆圈,我想做它,这样我就可以得到多于四个的切片。我可以轻松地做四个象限,因为我只检查鼠标是否在圆圈内和盒子内。

这就是我检查点是否在圆圈中的方式。

if( Math.sqrt((xx-x)*(xx-x) + (yy-y)*(yy-y)) <= radius)
{
    return true;
}
else
{
    return false;
}

如果圆圈被分成 4 个以上的区域,我该如何修改?

4

3 回答 3

4

对于径向切片(圆形扇区),您有几种选择:

  1. 用于Math.atan2计算圆心到该点的直线的 4 象限角。比较切片角度以确定切片索引。
  2. 对于特定切片,您可以测试该点落在每个切片边缘的哪一侧。相应地对点进行分类。这计算起来更复杂,但可能比调用更快(对于单个切片)Math.atan2

以下示例代码计算特定点的切片索引:

int sliceIndex(double xx, double yy, double x, double y, int nSlices) {
    double angle = Math.atan2(yy - y, xx - x);
    double sliceAngle = 2.0 * Math.PI / nSlices;
    return (int) (angle / sliceAngle);
}

上面的代码做了以下假设:

  • 切片都是相同的(角度)宽度
  • 切片是逆时针索引的
  • 切片 0 从 +x 轴开始
  • 切片拥有右边缘但不拥有左边缘

如果这些假设不适用,您可以调整计算。(例如,您可以减去起始角度angle以消除假设 3。)

于 2013-03-01T18:24:23.533 回答
2

首先,我们可以像您一样检查该点是否在圆圈内。但我不会将它与检查哪个象限结合起来(这就是你有 radius/2 的原因吗?)

if( (xx-x)*(xx-x) + (yy-y)*(yy-y) > radius*radius)
   return false;

现在我们可以使用 atan2 函数查看该点所在的区域。atan2与 Arctan 类似,只是 Arctangent 函数总是返回介于 -pi/2 和 pi/2 之间的值(-90 和 +90 度)。我们需要极坐标方式的实际角度。现在假设 (x,y) 是您的圆的中心,我们对我们拥有的点 (xx,yy) 的位置感兴趣

  double theta = Math.atan2(yy-y,xx-x);
  //theta is now in the range -Math.PI to Math.PI
  if(theta<0)
     theta = Math.PI - theta;
  //Now theta is in the range [0, 2*pi]
  //Use this value to determine which slice of the circle the point resides in.
  //For example:
  int numSlices = 8;
  int whichSlice = 0;
  double sliceSize = Math.PI*2 / numSlices;
  double sliceStart;
  for(int i=1; i<=numSlices; i++) {
      sliceStart = i*sliceSize;
      if(theta < sliceStart) {
          whichSlice = i;
          break;
      }
  }
  //whichSlice should now be a number from 1 to 8 representing which part of the circle
  // the point is in, where the slices are numbered 1 to numSlices starting with
  // the right middle (positive x-axis if the center is (0,0).
于 2013-03-01T18:26:45.153 回答
1

这更像是一个三角问题尝试这样的事情。

 int numberOfSlices=8;

   double angleInDegrees=(Math.toDegrees(Math.atan2(xx-x ,yy-y)));

   long slice= Math.round(( numberOfSlices*angleInDegrees )/360 );
于 2013-03-01T20:22:43.947 回答