是否可以将Rectangle
对象绕其轴线旋转一定角度?这样做像Rectangle rect = new Rectangle(x,y,w,h,r)
那么简单吗?
如果不能旋转对象,有什么方法可以获得类似的结果呢?
编辑:为了更清晰明了,这是我的困境:我有一些图像可以旋转,但当它们与其他图像碰撞时,碰撞只在90度和180度旋转时起作用,因为它们的碰撞框矩形对象不会旋转。
是否可以将Rectangle
对象绕其轴线旋转一定角度?这样做像Rectangle rect = new Rectangle(x,y,w,h,r)
那么简单吗?
如果不能旋转对象,有什么方法可以获得类似的结果呢?
编辑:为了更清晰明了,这是我的困境:我有一些图像可以旋转,但当它们与其他图像碰撞时,碰撞只在90度和180度旋转时起作用,因为它们的碰撞框矩形对象不会旋转。
编辑:为了更清楚地说明我的困境,我有一些旋转的图像,但当它们与其他图像碰撞时,碰撞只在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除了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转换在底层实际执行的操作非常相似。
要旋转矩形,您需要为旋转提供一个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)
公式。
getTransform()
,如AffineTransform教程所述,而不是setTransform
,并且不要忘记重新设置原始变换。或者复制Graphics对象,进行变换和绘制,然后处理它。 - Hovercraft Full Of Eels