Как я могу нарисовать на JPanel, используя другой квадрант для координат? - PullRequest
0 голосов
/ 02 апреля 2010

Я хотел бы нарисовать некоторые фигуры на JPanel, переопределив paintComponent. Я хотел бы иметь возможность панорамирования и масштабирования. Панорамирование и масштабирование легко выполнить с помощью AffineTransform и метода setTransform для объекта Graphics2D. После этого я легко могу нарисовать фигуры с помощью g2.draw(myShape) Формы определены с помощью "мировых координат", поэтому он хорошо работает при панорамировании, и мне нужно перевести их в координаты canvas / JPanel перед рисованием.

Теперь я хотел бы изменить квадрант координат. От 4-го квадранта, который JPanel и компьютер часто используют, до 1-го квадранта, с которым пользователи лучше всего знакомы. X такой же, но ось Y должна увеличиваться вверх, а не вниз. Легко переопределить origo по new Point(origo.x, -origo.y);

Но как мне нарисовать фигуры в этом квадранте? Я бы хотел сохранить координаты фигур (определенные в мировых координатах), а не сохранять их в координатах холста. Поэтому мне нужно каким-то образом преобразовать их или преобразовать объект Graphics2D, и я хотел бы сделать это эффективно . Могу ли я сделать это с AffineTransform тоже?

Мой код для рисования:

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.blue);

            AffineTransform at = g2.getTransform();
            at.translate(-origo.x, -origo.y);
            at.translate(0, getHeight());
            at.scale(1, -1);
            g2.setTransform(at);
            g2.drawLine(30, 30, 140, 20);
            g2.draw(new CubicCurve2D.Double(30, 65, 23, 45, 23, 34, 67, 58));
        }

1 Ответ

1 голос
/ 02 апреля 2010

Это ответ не для манеры, поэтому он не проверен, но я думаю, что он будет работать.

Перевести на (0, высота). Это должно изменить положение источника внизу слева.

Масштабирование по (1, -1). Это должно перевернуть его вокруг оси X.

Я не думаю, что порядок операций имеет значение в этом случае.

...