Поворот объекта Rectangle в java



Можно ли вращать объект Rectangle до некоторой степени вокруг своей оси? Это так же просто, как Rectangle rect = new Rectangle(x,y,w,h,r)?



Если невозможно повернуть объект, каким образом я мог бы получить аналогичные результаты?



Edit: для ясности вот моя дилемма, у меня есть изображения, которые вращаются, но когда они сталкиваются с другими изображениями, столкновения работают только при поворотах на 90 и 180 градусов, потому что их прямоугольники не вращаются.

675   3  

3 ответов:

Edit: для ясности вот моя дилемма, у меня есть изображения, которые вращаются, но когда они сталкиваются с другими изображениями, столкновения работают только при поворотах на 90 и 180 градусов, потому что их прямоугольники не вращаются.

Вы можете вращать фигуры-производный объект, такой как Rectangle2D с помощью метода AffineTransform, createTransformedShape(...).

Rectangle2D myRect = new Rectangle2D.Double(100, 100, 200, 200);
AffineTransform at = AffineTransform.getRotateInstance(Math.PI / 4, 150, 150);
Shape rotatedRect = at.createTransformedShape(myRect);
Примечание: код не компилируется и не тестируется.

Чтобы повернуть прямоугольник, вы даете графическому контексту 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) для угла.

Есть и другой способ сделать это (кроме того createTransformedShape) что создает меньше временных объектов, если это желательно.

Вместо того, чтобы хранить Rectangle2D для ограничивающего прямоугольника, вы можете сохранить Path2D а затем сделайте трансформацию на месте, используя 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.
    }

    // ...
}

Это очень похоже на то, что AffineTransform на самом деле делает под капотом.

Comments

    Ничего не найдено.