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

您好我很好奇如何解决这个问题:我用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); } 

试试像……

在此处输入图像描述

该演示旨在允许图像通过虚拟天使(角度<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讨论了在水平和垂直轴上翻转图像的方法

是Swing / AWT吗? 如果是, AffineTransform可能就是你要找的东西。

鉴于您只有4张图片。 我建议在paint / gimp / photoshop中创建4个jpgs,并将它们加载到你的程序中;

 BufferedImage pacUp = ImageIO.read(new File("./images/pac_up.jpg")); BufferedImage pacDown = ImageIO.read(new File("./images/pac_down.jpg")); //etc 

然后你的绘图开关看起来像(假设一个Graphics对象g );

 switch(direction) { case 0: g.drawImage(pacUp, x, y, null); case 1: g.drawImage(pacDown, x, y, null); case 2: g.drawImage(pacLeft, x, y, null); case 3: g.drawImage(pacRight, x, y, null); }