Вращающийся прямоугольник и регулировка положения

В настоящее время я борюсь с вращением некоторых прямоугольников. У меня есть прямоугольник, который состоит из 9 маленьких прямоугольников. http://i57.tinypic.com/msn8ue.jpg

Теперь я повернул большой прямоугольник соответствующим образом с помощью аффинного преобразования, которое сработало довольно хорошо. http://i61.tinypic.com/25phlqp.jpg

Моя проблема в том, что теперь мне нужно переместить прямоугольники так, чтобы верхняя левая позиция каждого прямоугольника находилась в точке x, y.

Я не знаю, как это сделать, и я надеюсь, что вы можете мне помочь.

Спасибо!

public class MainClass {
    public static void main(String[] args) {
        JFrame jf = new JFrame("Demo");
        Container cp = jf.getContentPane();
        MyCanvas tl = new MyCanvas();
        cp.add(tl);
        jf.setSize(800, 800);
        jf.setVisible(true);
    }
}

class MyCanvas extends JComponent {

    private static final long serialVersionUID = 5703217428905757134L;

    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        int x = 400;
        int y = 400;
        int width = 100;
        int height = 200;
        final int OVERLAPPING_OUTLINE = 10;

        Rectangle[] rect = new Rectangle[9];

        rect[0] = new Rectangle(x + OVERLAPPING_OUTLINE, y + OVERLAPPING_OUTLINE, width - 2 * OVERLAPPING_OUTLINE, height - 2
                * OVERLAPPING_OUTLINE);

        rect[1] = new Rectangle(x - OVERLAPPING_OUTLINE, y - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
                OVERLAPPING_OUTLINE * 2);
        rect[2] = new Rectangle(x - OVERLAPPING_OUTLINE + width, y - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
                OVERLAPPING_OUTLINE * 2);

        rect[3] = new Rectangle(x - OVERLAPPING_OUTLINE, y + height - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
                OVERLAPPING_OUTLINE * 2);

        rect[4] = new Rectangle(x - OVERLAPPING_OUTLINE + width, y + height - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
                OVERLAPPING_OUTLINE * 2);
        rect[5] = new Rectangle(x - OVERLAPPING_OUTLINE, y + OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2, height
                - OVERLAPPING_OUTLINE * 2);
        rect[6] = new Rectangle(x - OVERLAPPING_OUTLINE + width, y + OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2, height
                - OVERLAPPING_OUTLINE * 2);
        rect[7] = new Rectangle(x + OVERLAPPING_OUTLINE, y - OVERLAPPING_OUTLINE, width - OVERLAPPING_OUTLINE * 2,
                2 * OVERLAPPING_OUTLINE);
        rect[8] = new Rectangle(x + OVERLAPPING_OUTLINE, y + height - OVERLAPPING_OUTLINE, width - OVERLAPPING_OUTLINE * 2,
                2 * OVERLAPPING_OUTLINE);

        for (Rectangle r : rect)
            g2.draw(r);
        g2.setColor(Color.RED);

        AffineTransform af = new AffineTransform();

        for (int i = 90; i < 360; i += 90) {
            af.rotate(Math.toRadians(i), x - OVERLAPPING_OUTLINE, y - OVERLAPPING_OUTLINE);
            for (Rectangle r : rect) {
                Shape shape = af.createTransformedShape(r);
                g2.draw(shape);
            }
        }
    }
}

person user2948795    schedule 20.10.2014    source источник


Ответы (1)


Похоже, вам нужно использовать AffineTransform.translate(double tx, double ty).

person Charles Spencer    schedule 05.08.2015