0

円が描かれていますが、4 つよりも多くのスライスを作成できるようにしたいと考えています。マウスが円とボックスの内側にあるかどうかを確認するだけなので、4 つの象限を簡単に実行できます。

これは、ポイントが円内にあるかどうかを確認する方法です。

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

最初に、ポイントが円の中にあることを確認できます。しかし、これをどの象限のチェックと組み合わせることはしません (半径/2 を持っているのはそのためですか?)

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

これで、atan2 関数を使用して、ポイントがどの領域にあるかを確認できます。atan2Arctangent 関数が常に -pi/2 と pi/2 (-90 と +90 度) の間の値を返すことを除いて、Arctan と似ています。極座標形式で実際の角度が必要です。(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 に答える