将Shape转换为Rectangle2D.Double的正确方法是什么?

时间:2014-07-27 22:30:18

标签: java

我需要转换(旋转)Rectangle2D.Double。但是,我不需要绘制形状,我还需要将变换后的矩形保持为对象,以便我可以使用.intersects()和其他方法。这是我正在改变它的当前方式

private Rectangle2D.Double transform(Rectangle2D.Double rect) {

    // make a new transform
    AffineTransform transform = new AffineTransform();
    // apply the transformation
    transform.rotate(Math.toRadians(theta), rect.x + rect.width / 2, rect.y + rect.height / 2);
    // get the resulting Shape
    Shape s = transform.createTransformedShape(hitbox);
    //return the finalized Rectangle
    // ?
}

现在,人们会认为以下方法可行

Rectangle2D.Double newRect = new Rectangle2D.Double();
newRect.setFrame(transform.createTransformedShape(rect).getBounds2D());

然而,在绘制时,这似乎根本不会旋转矩形,而是将其缩放非常大的数量(140倍)。

所以问题是:如何将Shape(正如绘制时的方式正确转换为正确的形式,即Rectangle2D.Double

如果不可能,那么仍有.intersects()和类似方法的替代方案是什么?

1 个答案:

答案 0 :(得分:3)

Rectangle2D是轴对齐的。它无法转动。请尝试使用Path2D。有一个很好的构造函数似乎正在做你想要的:
Path2D.Double(Shape shape, AffineTransform transform)

private Path2D.Double transform(Rectangle2D.Double rect) {

    AffineTransform transform = new AffineTransform();
    double angle = Math.toRadians(theta);
    transform.rotate(angle, rect.x + rect.width / 2, rect.y + rect.height / 2);

    return new Path2D.Double(rect, transform);
}

另请注意,您的toRadians(toRadians(theta))非常可疑,使您的角度非常小。