Как я могу обнаружить щелчок по треугольнику и прямоугольнику? - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу обнаружить щелчок по треугольнику и прямоугольнику. Вот код обнаружения щелчка по эллипсу. Как я могу сделать то же самое для треугольника и прямоугольника?

Вот код метода onClickEvent в классе Ellipse: Я хочу что-то подобное, но для треугольника и прямоугольника.

@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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...