Я хотел бы нарисовать некоторые фигуры на 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));
}