我画了一个圆圈,我想做它,这样我就可以得到多于四个的切片。我可以轻松地做四个象限,因为我只检查鼠标是否在圆圈内和盒子内。
这就是我检查点是否在圆圈中的方式。
if( Math.sqrt((xx-x)*(xx-x) + (yy-y)*(yy-y)) <= radius)
{
return true;
}
else
{
return false;
}
如果圆圈被分成 4 个以上的区域,我该如何修改?
对于径向切片(圆形扇区),您有几种选择:
Math.atan2
计算圆心到该点的直线的 4 象限角。比较切片角度以确定切片索引。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);
}
上面的代码做了以下假设:
如果这些假设不适用,您可以调整计算。(例如,您可以减去起始角度angle
以消除假设 3。)
首先,我们可以像您一样检查该点是否在圆圈内。但我不会将它与检查哪个象限结合起来(这就是你有 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).
这更像是一个三角问题尝试这样的事情。
int numberOfSlices=8;
double angleInDegrees=(Math.toDegrees(Math.atan2(xx-x ,yy-y)));
long slice= Math.round(( numberOfSlices*angleInDegrees )/360 );