使用Java中的算法更改图形的角度/位置

 mobiledu2502885853 发布于 2023-03-19 06:56
  • php
  • 您好我很好奇如何解决这个问题:我在Java中使用fillArc,drawArc方法创建了一个pacman,我现在屏幕上有一个pacman人,无论方向如何,总是向右看..我的问题是..有没有办法逐个改变对象或在Java中水平翻转它?

    我试图使用AffineTransform,但我没有得到我想要的文档...我应该如何使用switch语句实现这一点?我试着做以下事情但是我被困在这个部分,因为我不知道如何继续.

    DrawPacMan pacman = new DrawPacMan();
    DrawPacMan ghost1 = new DrawPacMan();
    DrawPacMan ghost2 = new DrawPacMan();
    
    AffineTransform pac = new AffineTransform();
    
    public void setPacManView(int waarde) {
        // set the view of pacman
        switch (waarde) {
        case 0 :
            // here one view of pacman
            break;
        case 1 :
            // here one view of pacman
            break;
        case 2 :
            // here one view of pacman
            break;
        case 3 :
            // here one view of pacman
            break;
    
        }
    }
    
    public void paintComponent(Graphics g) {
    
        super.paintComponent(g);
        // pacman movement
        diameter = 75;  
        pacman.drawPacMan(g, getHorPlaats(), getVerPlaats(), diameter, Color.yellow);
    
        // ghosts movement
        int g1x;
        for(g1x = 0; g1x < 10; g1x++) {
    
            pacman.drawGhost(g, g1x, 40, diameter, Color.red);
    
        }
        pacman.drawGhost(g, 170, 70, diameter, Color.blue);
    
    
    }
    

    MadProgramme.. 6

    试试像......

    在此输入图像描述

    该演示旨在允许图像通过虚拟天使旋转(角度<0&> 360),但基本概念是相同的......

    public class TestFlipImage {
    
        protected static final String IMAGE_PATH = "/path/to/your/image";
    
        public static void main(String[] args) {
            new TestFlipImage();
        }
    
        public TestFlipImage() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException ex) {
                    } catch (InstantiationException ex) {
                    } catch (IllegalAccessException ex) {
                    } catch (UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
    
                    BufferedImage image = null;
                    try {
                        image = ImageIO.read(new File(IMAGE_PATH));
                    } catch (IOException ex) {
                    }
    
                    JPanel mainPane = new JPanel(new GridBagLayout());
                    GridBagConstraints gbc = new GridBagConstraints();
                    mainPane.add(new ImagePane(image, 0));
                    mainPane.add(new ImagePane(image, 90));
                    mainPane.add(new ImagePane(image, 180));
    
                    frame.add(mainPane);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class ImagePane extends JPanel {
    
            private BufferedImage masterImage;
            private BufferedImage renderedImage;
    
            public ImagePane(BufferedImage image, int angle) {
                masterImage = image;
                applyRotation(angle);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(renderedImage.getWidth(), renderedImage.getHeight());
            }
    
            @Override
            public Dimension getMinimumSize() {
                return getPreferredSize();
            }
    
            protected int getVirtualAngle(int angle) {
                float fRotations = (float) angle / 360f;
                int rotations = (int) (fRotations - (fRotations / 1000));
    
                int virtual = angle - (rotations * 360);
    
                if (virtual < 0) {
                    virtual = 360 + virtual;
                }
    
                return virtual;
            }
    
            // The code is designed to rotate an image through 90 degree
            // angles, but it can handle angle's less then 0 and greater then
            // 360 degrees
            public void applyRotation(int angle) {
                // This will only work for angles of 90 degrees...
    
                // Normalize the angle to make sure it's only between 0-360 degrees
                int virtualAngle = getVirtualAngle(angle);
                Dimension size = new Dimension(masterImage.getWidth(), masterImage.getHeight());
                int masterWidth = masterImage.getWidth();
                int masterHeight = masterImage.getHeight();
    
                double x = 0; //masterWidth / 2.0;
                double y = 0; //masterHeight / 2.0;
    
                switch (virtualAngle) {
                    case 0:
                        break;
                    case 180:
                        break;
                    case 90:
                    case 270:
                        size = new Dimension(masterImage.getHeight(), masterImage.getWidth());
                        x = (masterHeight - masterWidth) / 2.0;
                        y = (masterWidth - masterHeight) / 2.0;
                        break;
                }
                renderedImage = new BufferedImage(size.width, size.height, masterImage.getTransparency());
                Graphics2D g2d = renderedImage.createGraphics();
    
                AffineTransform at = AffineTransform.getTranslateInstance(x, y);
    
                at.rotate(Math.toRadians(virtualAngle), masterWidth / 2.0, masterHeight / 2.0);
                g2d.drawImage(masterImage, at, null);
    
                g2d.dispose();
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                Graphics2D g2d = (Graphics2D) g;
                int width = getWidth() - 1;
                int height = getHeight() - 1;
    
                int x = (width - renderedImage.getWidth()) / 2;
                int y = (height - renderedImage.getHeight()) / 2;
    
                g2d.drawImage(renderedImage, x, y, this);
            }
        }
    }
    

    额外

    您可能还想看看AffineTransform.rotate() - 如何同时进行xlate,旋转和缩放?wch讨论了在水平轴和垂直轴上翻转图像的方法

    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有