方法Math.atan2()接收两个参数,可以用来计算两点间连线的倾斜角。
在圆形中使用可以如下这样:
1、点击点坐标x,y
2、圆心坐标centerX,centerY
3、Math.atan2(y-centerY,x-centerX)
此处需要注意:第一个参数是y坐标的差值,第二个是x坐标的差值;
使用点击点的坐标去减圆心坐标。
4、步骤3中计算所得值是弧度值radian,转换成角度:
radian*180/ Math.PI
5、这个角度都是相对于x轴正方向的水平线的角度,所以需要换算成在整个圆中的角度:
如上图,按1、2、3、4分成四个区域, 那么算出来的角度值分别为:
1和4区域为负值,2和3区域为正值。
如果默认画圆形的时候,从三点钟方向开始,那么可以得知如下结论:
2和3区域的角度值即为可用值,1和4区域角度值加上360即为可用值。
6、最后,根据每个数据所占的角度范围,就可以判断在点击时,点击了哪个扇形的数据了。
代码示例:
//获取点击位置的角度
//-----------方法中,centerX,centerY是圆心坐标;radius是圆形半径
private double getAngle(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
double alfa = -1;
//点击的位置到圆心距离的平方
double distance = Math.pow(eventX - centerX, 2) + Math.pow(eventY - centerY , 2);
//判断点击的坐标是否在圆内
if (distance < Math.pow(radius, 2)) {
int which = touchOnWhichPart(event);//区域判断
switch (which) {
case 1:
case 4:
alfa = Math.atan2(eventY-centerY ,eventX-centerX)*180/ Math.PI+360 ;
break;
case 2:
case 3:
alfa = Math.atan2(eventY-centerY ,eventX-centerX)*180/ Math.PI ;
break;
}
}
return alfa;//从三点钟方向算起的角度值
}
//获取点击是在哪一个区域
private int getRegion(MotionEvent event) {
if (event.getX() >centerX) {
if (event.getY() >centerY) return 2;
else return 1;
} else {
if (event.getY() > centerY) return 3;
else return 4;
}
}