如何检测点击三角形和矩形?

时间:2018-04-26 13:39:23

标签: android click detection shapes

我想检测点击三角形和矩形的形状。 这是一个点击Ellipse的检测代码。 我怎么能对三角形和矩形做同样的事情呢?

以下是Ellipse类中onClickEvent方法的代码: 我想要类似的东西,但是要三角形和矩形。

@Override
protected void onClickEvent(float x, float y) {

    float a ;
    float b ;
    PointF f1, f2 ;

    if(Math.abs(getHeight()*getScaleY()) >= Math.abs(getWidth()*getScaleX())){
        a = getHeight()*getScaleY()/2 ;
        b = getWidth()*getScaleX()/2 ;
        // On calcul les points focaux (c = sqrt (a² - b²))
        // Point focal F1(0;c) et F2(0;-c)
        float c = (float) Math.sqrt(a*a - b*b);
        f1 = new PointF(0, c);
        f2 = new PointF(0, -c);
    }

    else{
        b = getHeight()*getScaleY()/2 ;
        a = getWidth()*getScaleX()/2 ;
        // On calcul les points focaux (c = sqrt (a² - b²))
        // Point focal F1(c;0) et F2(-c;0)
        float c = (float) Math.sqrt(a*a - b*b);
        f1 = new PointF(c, 0);
        f2 = new PointF(-c, 0);
    }

    // On calcul x et y dans le repère de l'ellipse
    // Translation pour se placer au centre de l'ellipse
    x -= getCenterX() ;
    y = getCenterY() - y;

    // Rotation
    double angleRadian = getAngle()/180*Math.PI ;
    float newX = (float) (x * Math.cos(angleRadian) - y * Math.sin(angleRadian));
    float newY = (float) (x * Math.sin(angleRadian) + y * Math.cos(angleRadian));

    // On détermine si le clic fait parti de l'ellipse
    // Distance entre le click et le point f1
    float dist1 = (float) Math.sqrt(Math.pow((newX - f1.x), 2) + Math.pow((newY - f1.y), 2));
    // Distance entre le click et le point f2
    float dist2 = (float) Math.sqrt(Math.pow((newX - f2.x), 2) + Math.pow((newY - f2.y), 2));
    // Somme des distances
    float dist = dist1 + dist2 ;

    if(style == Paint.Style.STROKE){
        float stroke = (strokeWidth >= MIN_STROKE_DETECTION) ? strokeWidth : MIN_STROKE_DETECTION ;
        if( dist <= (Math.abs(2*a) + stroke/2) && dist >= (Math.abs(2*a) - stroke/2))
            setSelected(true);
        else
            setSelected(false);
    }

    else{
        if(dist <= Math.abs(2*a))
            setSelected(true);
        else
            setSelected(false);
    }
}

0 个答案:

没有答案