повернуть форму java2d, не теряя своего происхождения - PullRequest
1 голос
/ 26 ноября 2009
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);
}

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

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

Ответы [ 3 ]

2 голосов
/ 26 ноября 2009

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

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   ]
0 голосов
/ 26 ноября 2009

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

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

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

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

0 голосов
/ 26 ноября 2009

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

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

  • Перевести на x и y этой точки (не уверен насчет положительного или отрицательного ... попробуйте оба)
  • Поворот
  • Перевести обратно
...