我画了一个圆圈,我想要这样做,所以我可以拥有比四个更多的切片。我可以很容易地做四个象限,因为我只是检查鼠标是否在圆圈内和盒子里面。
这就是我检查点是否在圆圈中的方式。
if( Math.sqrt((xx-x)*(xx-x) + (yy-y)*(yy-y)) <= radius)
{
return true;
}
else
{
return false;
}
如果将圆圈划分为4个以上的区域,我该如何修改?
答案 0 :(得分:4)
对于径向切片(圆形扇形),您有几种选择:
Math.atan2
计算从圆心到点的直线的四象限角度。与切片角度进行比较以确定切片索引。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。)
答案 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 );