2

指定された座標で形状を描画する関数は次のとおりです。

public void drawTank(int x,int y){
   int h = 50;
   int w = 50;

   graphic.setColor(Color.darkGray);
   graphic.drawRect(x, y, h, w);
   graphic.fillRect(x, y, h, w);
   graphic.setColor(Color.GRAY);
   graphic.drawRect(x+50, y+20, 35, 10);
   graphic.fillRect(x+50, y+20, 35, 10);
}

上記の関数に「angle」という変数をもう1つ追加して、画像も指定された角度(drawTank(int x、int y、int angle))で回転するようにします。

例で更新

私がやろうとしたのは、Graphics2Dを初期化し、コードをそれぞれ変更したことです。

g2D.setColor(Color.darkGray);
g2D.drawRect(x, y, h, w);
g2D.fillRect(x, y, h, w);
g2D.setColor(Color.red);
g2D.drawRect(x+50, y+20, 35, 10);
g2D.fillRect(x+50, y+20, 35, 10);
g2D.rotate((Math.toRadians(angle)));

しかし、これは実際には何もしません。:/

4

2 に答える 2

2

優先順位が重要です...

2番目の例では、すべてを描画した後に回転を適用します。これはグラフィックスの仕組みではありません。最初に変換を適用する必要があります。その後、すべてがその変換を使用します。

ここに画像の説明を入力してください

public class TestRotateImage {

    public static void main(String[] args) {
        new TestRotateImage();
    }

    public TestRotateImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JSlider slider;
        private Rectangle rectangle;

        public TestPane() {
            setLayout(new BorderLayout());
            rectangle = new Rectangle(0, 0, 100, 100);
            slider = new JSlider();
            slider.setMinimum(0);
            slider.setMaximum(360);
            slider.setMinorTickSpacing(5);
            slider.setMajorTickSpacing(10);
            slider.setValue(0);
            add(slider, BorderLayout.SOUTH);
            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    repaint();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        public double getAngle() {

            return Math.toRadians(slider.getValue());

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g.create();

            g2d.setColor(Color.RED);
            g2d.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
            g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);

            g2d.setColor(Color.BLACK);
            int x = (getWidth() - rectangle.width) / 2;
            int y = (getHeight() - rectangle.height) / 2;
            AffineTransform at = new AffineTransform();
            at.setToRotation(getAngle(), x + (rectangle.width / 2), y + (rectangle.height / 2));
            at.translate(x, y);
            g2d.setTransform(at);
            g2d.draw(rectangle);
            g2d.dispose();

        }

    }

}

詳細については、図形、テキスト、画像の変換をご覧ください。

于 2013-02-14T23:00:42.717 に答える
0

これが力ずくで行う方法です。Java.lang.Math と java.awt.Graphics (既にインスタンスを持っています) を見てください。これにより、描画多角形関数を使用して四角形の点を計算できます。これは、sin と cos を使用して行うことができます。 Java.lang.Math の関数

実際には、この方法で計算する必要があるのは 2 つの点だけです。開始点は、隣接する 2 つの座標を計算する 90 度の頂点になるからです。そこから、あなたが持っているポイントとあなたの寸法値を使って足し算と引き算をするだけで、あなたの出発点にキティコーナーの最後のポイントを得ることができます.

私はあなたのためにそれを理解し、いくつかのサンプルコードを書きますが、それであなたはどんな楽しみを残しますか?

于 2013-02-14T21:51:56.020 に答える