Graphics2D — Вращение фигур на объекте Graphics2D

У меня есть объект Graphics2D, который я использую для рисования на моем Canvas. Я рисую несколько фигур на Canvas и хочу преобразовать только одну (или часть) из них.

Я постараюсь сделать это просто:

void render(Graphics2D g) {
    ... // Draw shape 1
    ... // Draw shape 2
    ... // Draw shape 3
}

Как мне повернуть фигуру 2, оставив фигуры 1 и 3 нетронутыми? Под "поворотом" я подразумеваю вращение вокруг центральной точки, которую мы можем определить, например, как x и y.

Я искал способ сделать это некоторое время, но не мог найти ничего, что работало бы так, как я хочу.

Есть ли простой способ сделать это?


person Acidic    schedule 29.11.2011    source источник
comment
не удалось найти ничего, что работало бы так, как мне нужно Можете ли вы показать SSCCE из вашей лучшей попытки? Опишите, каким образом преобразование не соответствует вашим ожиданиям.   -  person Andrew Thompson    schedule 29.11.2011


Ответы (3)


Вместо того, чтобы вращать фигуру вокруг ее центральной точки, поверните, а затем переместите холст. Чтобы повернуть фигуру вокруг центра в точке (x, y), сначала переместите холст на (-x, -y), а затем поверните холст на -d градуса и нарисуйте фигуру как обычно в точке (0,0).

Когда вы закончите, поверните назад, а затем переместите обратно (обратите внимание, что с этими геометрическими преобразованиями важен порядок, перемещение, а затем вращение даст вам совершенно другой результат).

Это означает, что вы по-прежнему можете рисовать объект при любом повороте без необходимости самостоятельно пересчитывать координаты.

person Martin Foot    schedule 29.11.2011
comment
Я немного изменил это, чтобы оно выглядело так: 1) g.translate(x, y) 2) g.rotate(d) 3) нарисуйте фигуру с центром в (0, 0) 4) g.rotate(-d) 5) g.translate(-x, -y). Это работает именно так, как я хочу. Спасибо. - person Acidic; 29.11.2011

    AffineTransform afx = new AffineTransform();
    afx.rotate(angleRad, s.getCenter().x, s.getCenter().y);
    //afx.rotate(angleRad);
    java.awt.Shape ss = afx.createTransformedShape(s.getPrimativeShape());
    return ss;   

s — это мой класс-оболочка для java.awt.Shape, и он делает с ним кое-что… Но то, что вам нужно, находится в строке 2. afx.rotate(Angle,xAnchorPoint,yAnchorPoint); afx.rotate поворачивает объект относительно точки (xAnchorPoint;yAnchorPoint).

Надеюсь, это то, что вы хотели

person Markus    schedule 28.03.2012

Чтобы повернуть фигуру, используйте один из методов Graphics2D.rotate.

Кэшируйте преобразование, используемое как для shape 1, так и для shape 3. Прежде чем рисовать shape 3, убедитесь, что вы сбросили преобразование на кешированное, поскольку использование rotate вместо shape 2 изменит текущие координаты преобразования.

Шаги:

  1. Кэшировать текущее преобразование
  2. Нарисуй shape 1
  3. Повернуть
  4. Рисовать shape 2
  5. Установить преобразование в кешированное
  6. Нарисуй shape 3
person mre    schedule 29.11.2011
comment
Это работает, поскольку вращает фигуру, но не остается на одном месте. - person Acidic; 29.11.2011