问题描述
这是在给定坐标处绘制形状的函数:
Here's the function which draws a shape at the given coordinates:
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'的变量,这样图像也会旋转指定的角度(drawTank(int x,int y,int angle)。
I want to add one more variable to the above function called 'angle', so that the image is also rotated by the angle specified (drawTank(int x,int y,int angle).
更新为示例
我试图做的是我初始化了Graphics2D并分别更改了我的代码:
What I tried to do is that I initialized Graphics2D and changed my code respectively:
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)));
但是,这实际上没有做任何事情。:/
But, this doesn't actually do anything. :/
推荐答案
优先权很重要......
Precedence matters...
在你的第二个例子中,你在绘制完所有东西之后应用了一个旋转。这不是图形的工作方式。你需要先应用变换,然后是后面的所有内容使用该转换。
In your second example, you're apply a rotation AFTER you've drawn everything. This is not how graphics works. You need to apply the transformation first, then everything that follows will use that transformation.
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();
}
}
}
您可能想看看了解更多信息
You might like to take a look at Transforming Shapes, Text and Images for more information
这篇关于按指定的角度在java中旋转图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!