Java AWT / Swing "содержит" и "пересекает" методы, работающие неправильно - PullRequest
3 голосов
/ 04 января 2012

Я пытаюсь научить себя Java AWT и простой графике, но у меня возникли трудности с использованием метода содержимого и пересечений.

Проблема в том, что кажется, что он обнаруживает столкновение на несколько пикселей выше, чемщелчок мыши и фактическая форма.

GameDemo.java

package uk.co.mhayward.games.sandbox;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameDemo extends JFrame {

    GamePanel gamePanel = new GamePanel();

    public static void main(String[] args) {
        new GameDemo();
    }

    public GameDemo() {
        super("click me");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.add(gamePanel);
        this.setSize(200, 200);

        this.setVisible(true);
        this.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {}

            public void mousePressed(MouseEvent e) {
                System.out.println(e.getPoint().toString());
                if (gamePanel.shape.contains(e.getPoint())) {
                    System.out.println("IN");
                } else {
                    System.out.println("out");
                }
            }

            public void mouseReleased(MouseEvent e) {}

            public void mouseEntered(MouseEvent e) {}

            public void mouseExited(MouseEvent e) {}
        });
    }

    public class GamePanel extends JPanel {

        Shape shape = new RegularPolygon(100, 100, 100, 6, 0);

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;

            g2d.setStroke(new BasicStroke(1));
            g2d.setPaint(Color.WHITE);
            g2d.fill(shape);
            g2d.setPaint(Color.BLACK);
            g2d.draw(shape);
        }
    }

    public static class RegularPolygon extends Polygon {
        private static final long serialVersionUID = 8828151557263250246L;

        /**
         * @param x
         * @param y
         * @param r
         * @param vertexCount
         */
        public RegularPolygon(int x, int y, int r, int vertexCount) {
            this(x, y, r, vertexCount, 0);
        }

        /**
         * @param x
         * @param y
         * @param r
         * @param vertexCount
         * @param startAngle
         *            360deg = PI
         */
        public RegularPolygon(int x, int y, int r, int vertexCount, double startAngle) {
            super(getXCoordinates(x, y, r, vertexCount, startAngle),
                    getYCoordinates(x, y, r, vertexCount, startAngle),
                    vertexCount);
        }

        protected static int[] getXCoordinates(int x, int y, int r, int vertexCount, double startAngle) {
            int res[] = new int[vertexCount];
            double addAngle = 2 * Math.PI / vertexCount;
            double angle = startAngle;
            for (int i = 0; i < vertexCount; i++) {
                res[i] = (int) Math.round(r * Math.cos(angle)) + x;
                angle += addAngle;
            }
            return res;
        }

        protected static int[] getYCoordinates(int x, int y, int r, int vertexCount, double startAngle) {
            int res[] = new int[vertexCount];
            double addAngle = 2 * Math.PI / vertexCount;
            double angle = startAngle;
            for (int i = 0; i < vertexCount; i++) {
                res[i] = (int) Math.round(r * Math.sin(angle)) + y;
                angle += addAngle;
            }
            return res;
        }
    }
}

РЕДАКТИРОВАТЬ

04 /Январь / 12 - изменено Переопределить краску (g) на paintComponent (g) - все еще не обнаруживает столкновения должным образом. 05 / Jan / 12 - создан SSCCE для более простой демонстрации проблемы.

Ответы [ 4 ]

5 голосов
/ 05 января 2012

Для справки: short пример исследует преобразованный Polygon с использованием метода contains().Результат кажется правильным с точностью до пикселя.Вы можете сравнить это с вашим результатом.

4 голосов
/ 05 января 2012

Слушайте на панели, а не на JFrame. Вы видите смещение от заголовка.

2 голосов
/ 04 января 2012

у вас есть переопределение paintComponent(Graphics g) для Swing JComponents вместо метода, действительного для AWT paint(Graphics g), больше в учебниках 2D-графика и Выполнение пользовательской рисования

1 голос
/ 04 января 2012

у вас есть переопределение paintComponent (Graphics g) для Swing JComponents вместо метода, действительного для AWT paint (Graphics g)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...