0

長方形が回転している場合に、マウスクリックイベントが長方形の内側でクリックされたかどうかを判断する方法を理解するのに問題があります。

これと同じくらい単純なMouseAdapterがあるとしましょう。mousePressedが実際に長方形内にあった場合、長方形内にヒットしたというステートメントを出力するだけです。

MouseAdapter mAdapter = new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        int xPos = e.getX();
        int yPos = e.getY();
        if(xPos >= rect.x && xPos <= rect.x + rect.width && yPos >= rect.y && yPos <= rect.y + rect.height) {
            System.out.println("HIT INSIDE RECTANGLE");
        }
    }
};

私の問題は、長方形を回転させたときに発生します。上記のifステートメントは明らかに回転を考慮していないため、長方形を回転させた後、ヒットテストは失敗します。回転については、paint()関数でこれと同じくらい簡単なことをしています:

class drawRect {

    Rectangle rect = new Rectangle();

    ...

    public void paint(Graphics g) {
        Graphcis2D g2 = (Graphics2D) g;
        AffineTransform old = g2.getTransform();
        g.rotate(Math.toRadians(90), rect.x, rect.y); 
        g2.draw(rect);
        g2.setTransform(old);
    }
}

これは簡単な擬似コードなので、皆さんは私がやろうとしていることを理解できます。したがって、構文などについて心配する必要はありません。どんな助けでもいただければ幸いです!

4

1 に答える 1

2

マウス座標にも回転を適用できます。ドライコード:

MouseAdapter mAdapter = new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        // Create the same transform as used for drawing the rectangle
        AffineTransform t = new AffineTransform();
        t.rotate(Math.toRadians(90), rect.x, rect.y);
        Point2D tp = t.inverseTransform(e.getPoint());

        if(rect.contains(tp)) {
            System.out.println("HIT INSIDE RECTANGLE");
        }
    }
};
于 2013-02-08T20:52:34.693 に答える