Поворот объекта Rectangle в java
Можно ли вращать объект Rectangle до некоторой степени вокруг своей оси? Это так же просто, как Rectangle rect = new Rectangle(x,y,w,h,r)?
Если невозможно повернуть объект, каким образом я мог бы получить аналогичные результаты?
Edit: для ясности вот моя дилемма, у меня есть изображения, которые вращаются, но когда они сталкиваются с другими изображениями, столкновения работают только при поворотах на 90 и 180 градусов, потому что их прямоугольники не вращаются.
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