在Java中旋转矩形对象

3

是否可以将Rectangle对象绕其轴线旋转一定角度?这样做像Rectangle rect = new Rectangle(x,y,w,h,r)那么简单吗?

如果不能旋转对象,有什么方法可以获得类似的结果呢?

编辑:为了更清晰明了,这是我的困境:我有一些图像可以旋转,但当它们与其他图像碰撞时,碰撞只在90度和180度旋转时起作用,因为它们的碰撞框矩形对象不会旋转。


2
查找AffineTransform的使用。 - Hovercraft Full Of Eels
我不需要对物体进行视觉旋转,我需要旋转图像的Hit Box,而Hit Box是一个矩形对象。 - Chris
你的评论毫无意义。AffineTransforms确实用于旋转矩形。 - Hovercraft Full Of Eels
让我在代码中尝试一下,然后再继续谈论。 - Chris
我应该如何旋转矩形?下面的代码使用了绘图,而我需要使用实际的矩形对象。 - Chris
3个回答

3

编辑:为了更清楚地说明我的困境,我有一些旋转的图像,但当它们与其他图像碰撞时,碰撞只在90度和180度旋转时起作用,因为它们的碰撞框矩形对象不会旋转。

您可以使用AffineTransform方法createTransformedShape(...)旋转Shape派生对象,例如Rectangle2D。

Rectangle2D myRect = new Rectangle2D.Double(100, 100, 200, 200);
AffineTransform at = AffineTransform.getRotateInstance(Math.PI / 4, 150, 150);
Shape rotatedRect = at.createTransformedShape(myRect);

注意:代码未编译也未测试。

createTransformedShape(new Rectangle(x,y,w,h))?我并不打算对我的旋转矩形进行任何可视化的操作,而且似乎所有的例子都涉及到可视化重塑。 - Chris
好的,抱歉我刚刚将Rectangle2D与Graphics关联起来了,但是在阅读Shapes、Rectangle2D、AffineTransform和其他一些文档之后,我现在明白了。对于造成的麻烦我很抱歉。 - Chris

0

除了createTransformedShape方法之外,还有另一种创建更少临时对象的方式,如果这是可取的话。

你可以使用Path2D代替保留Rectangle2D作为边界框,然后使用Path2D.transform(AffineTransform)就地进行变换:

import java.awt.geom.*;

public class Example {
    private final Path2D hitBox;

    public Example(Rectangle2D initialHitBox) {
        this.hitBox = new Path2D.Double(initialHitBox);
    }

    public void transform(AffineTransform tx) {
        path.transform(tx); // In-place transformation.
    }

    // ...
}

这与Affine转换在底层实际执行的操作非常相似。


0

要旋转矩形,您需要为旋转提供一个AffineTransform图形上下文。以下是一个示例:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    AffineTransform oldTransform = g2d.getTransform();
    g2d.setTransform(AffineTransform.getRotateInstance(radians);
    g2d.draw(rectangle);
    g2d.setTransform(oldTransform);
}

你也可以使用 g2d.rotate(radians) 进行旋转操作。

注意角度必须是弧度制,若需要将角度转换为弧度,可以使用 degrees * (Math.PI/180) 公式。


我的绘制旋转图形很好,问题是它们的碰撞框不随着图形旋转,导致奇怪的物理效果。 - Chris
1
考虑使用 getTransform(),如AffineTransform教程所述,而不是setTransform,并且不要忘记重新设置原始变换。或者复制Graphics对象,进行变换和绘制,然后处理它。 - Hovercraft Full Of Eels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接