使用Math.atan2计算的方式,获知圆形各个扇区的点击事件

方法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;
        }
    }

猜你喜欢

转载自blog.csdn.net/aianzxy/article/details/102824663