gpt4 book ai didi

java - 使用 Java 中的算法更改绘图的角度/位置

转载 作者:行者123 更新时间:2023-11-29 10:17:59 24 4
gpt4 key购买 nike

你好,我很好奇如何解决这个问题:我用 Java 中的 fillArc、drawArc 方法创建了一个吃 bean 人,现在我的屏幕上出现了一个吃 bean 人,无论它朝哪个方向移动,它总是向右看。 .我的问题是..有没有办法在 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);


}

最佳答案

尝试类似...

enter image description here

该演示旨在让图像通过虚拟角度(角度 < 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() - how do I xlate, rotate, and scale at the same time? wch 讨论了一种在水平轴和垂直轴上翻转图像的方法

关于java - 使用 Java 中的算法更改绘图的角度/位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12824684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com