Отрисовка картинки повернутой в направлении движения | Graphics | Graphics2D

Надо отрисовать картинку повернутую в направлении движения (поворот должен быть относительно центра картинки):

Пример:

Я знаю скорость по x и y, и положение картинки(x,y), и размер картинки(ширина и высота), а так же размер поля на котором рисую


Я пробовал так:

Graphics2D g = (Graphics2D) gr;
g.rotate(Math.toRadians(Math.atan(vx/vy))); // vx,vy - скорость по x и y
g.fillRect((int)(x-w/2), (int) (y-h/2), w, h); // Это я потом заменю на картинку

но картинка повернута НЕ относительно центра и поворот неправильный


Подробности:

  1. Рисую на JPanel в методе paint(Graphics gr)
  2. Использую Graphics2D

Ответы (1 шт):

Автор решения: MBo
  1. Math.atan требует отношения y/x, но это не так важно, потому что см. ниже

  2. Math.atan нужно заменить на Math.atan2(vy, vx), чтобы получить угол во всём диапазоне

  3. Результат Math.atan/atan2 уже в радианах, не нужно ещё преобразовывать, если rotate требует радианов

Для поворота относительно определенной точки (cx, cy) матрица аффинного преобразования строится так:

перенос на (-cx, -cy)
поворот
перенос на (cx, cy) 

В Graphics2D я вижу для этого перекрытый метод:

rotate(double theta,  double x,  double y)
→ Ссылка