Java - 如何检查点是否在圆片的内部

时间:2013-03-01 18:15:37

标签: java math geometry

我画了一个圆圈,我想要这样做,所以我可以拥有比四个更多的切片。我可以很容易地做四个象限,因为我只是检查鼠标是否在圆圈内和盒子里面。

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

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

如果将圆圈划分为4个以上的区域,我该如何修改?

3 个答案:

答案 0 :(得分:4)

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

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

    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。)

答案 1 :(得分:2)

首先,我们可以像您一样检查点是否在圆圈内。但是我没有把它与检查哪个象限(这就是为什么你有半径/ 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).

答案 2 :(得分:1)

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

 int numberOfSlices=8;

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

   long slice= Math.round(( numberOfSlices*angleInDegrees )/360 );