旋转多个图像-Java

旋转多个图像-Java,java,rotation,graphics2d,Java,Rotation,Graphics2d,我正在用Java为一个类项目创建一个飞行雷达模拟器 到目前为止,我已经能够显示许多小型飞机图像,它们以给定的方向和不同的速度在雷达上移动 我的问题是如何旋转每个飞机图像以跟随其在雷达中的方向。 这条线显示了平面移动的方向,并且应该指向它。我假设您使用的是Java2d,所以您应该看看Java中有几种方法可以做到这一点AffineTransform可以工作,但我发现我无法轻松调整图像大小以处理非90度旋转。我最终实现的解决方案如下。以弧度表示的角度 public static BufferedIm

我正在用Java为一个类项目创建一个飞行雷达模拟器

到目前为止,我已经能够显示许多小型飞机图像,它们以给定的方向和不同的速度在雷达上移动

我的问题是如何旋转每个飞机图像以跟随其在雷达中的方向。


这条线显示了平面移动的方向,并且应该指向它。

我假设您使用的是Java2d,所以您应该看看Java中有几种方法可以做到这一点
AffineTransform
可以工作,但我发现我无法轻松调整图像大小以处理非90度旋转。我最终实现的解决方案如下。以弧度表示的角度

public static BufferedImage rotate(BufferedImage image, double angle) {
    double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
    int w = image.getWidth();
    int h = image.getHeight();
    int newW = (int) Math.floor(w * cos + h * sin);
    int newH = (int) Math.floor(h * cos + w * sin);
    GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment()
                                                  .getDefaultScreenDevice()
                                                  .getDefaultConfiguration();

    BufferedImage result = gc.createCompatibleImage(newW, newH, Transparency.TRANSLUCENT);
    Graphics2D g = result.createGraphics();
    g.translate((newW - w) / 2, (newH - h) / 2);
    g.rotate(angle, w/2, h/2);
    g.drawRenderedImage(image, null);
    g.dispose();
    return result;
}

就上述飞机而言,这是必然的。每架飞机只有几个像素宽,因此像素的舍入将是明显的。我想到了三个解决办法:1。使用更大的飞机图像,在缩放前旋转,并使用这些图像而不是旋转,2。在同一平面上以不同角度制作几个精灵,3。使用矢量而不是光栅图像(即svg)和蜡染之类的库。第三个想法更难实现,但会产生更好的图形效果。