повернуть фигуру java2d без потери ее происхождения

protected void paintComponent(Graphics g) {
    Graphics2D gr = (Graphics2D) g.create();
    // draw Original image
    super.paintComponent(gr);

    // draw 45 degree rotated instance
    int aci=-45;
    gr.transform(AffineTransform.getRotateInstance(Math.toRadians(aci)));
    super.paintComponent(gr);

    //translate rotated instance from origin to +10 on y axes
    gr.translate(0,10);
    super.paintComponent(gr);
}

Но что, если я хочу нарисовать повернутую фигуру в исходной точке изображения.

Я имею в виду, что хочу повернуть исходную форму без скольжения


person soField    schedule 26.11.2009    source источник
comment
Я не совсем понял, что вы хотите сделать ... Вы хотите вращать по началу оси плоскости или по началу формы ??   -  person Diego Dias    schedule 26.11.2009


Ответы (3)


Чтобы повернуть изображение через определенное начало, используйте

x2 = cos(angle)*(x1 - x0) -sin(angle)*(y1 - y0) + x0

y2 = sin(angle)*(x1 - x0) + cos(angle)*(y1 - y0) + y0

Где (x0, y0) - желаемое начало координат.

Чтобы это было проще, просто используйте матричные обозначения

 [x2    [cos -sin x0   [x1 - x0  
  y2 =   sin cos  y0    y1 - y0
  1]      0   0    1]      1   ]
person Diego Dias    schedule 26.11.2009

Во-первых, подсказка. Вместо gr.transform(blablabla);, я думаю, можно использовать gr.rotate(angle);.

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

  • Переведите по x и y этой точки (не уверен, положительный или отрицательный ... попробуйте оба)
  • Повернуть
  • Перевести обратно
person Bart van Heukelom    schedule 26.11.2009
comment
я думаю, они делают ту же работу, не так ли? - person soField; 26.11.2009
comment
Однако, если он хочет повернуться вокруг начала координат объекта, ему не нужно выполнять два перевода; ему просто нужно сделать это, если он хочет вращаться вокруг произвольной точки (что по-прежнему является хорошей информацией). - person jprete; 26.11.2009
comment
@soField: Да, но использование метода поворота - удобный ярлык. - person Bart van Heukelom; 26.11.2009

Когда вы делаете такие вещи, вы должны помнить, что вы никогда не перемещаете нарисованное. Вы, так сказать, перемещаете только кисть.

Обычно вы делаете что-то в этом роде:

  1. Переместите исходную точку чертежа в точку, где вы хотите рисовать.
  2. Поверните кисть под нужным углом.
  3. Раскрасьте объект.
  4. Отмените старые преобразования, чтобы не повлиять на будущие объекты.

Однако я не могу вспомнить правильный порядок перевода и поворота. (Есть какие-то комментарии?)

person jprete    schedule 26.11.2009