Java 旋转矩形并调整位置
我目前正在努力解决一些矩形的旋转问题。 我有一个由9个小矩形组成的矩形。 现在我用仿射变换旋转了大矩形,效果很好。 我的问题是,我现在需要移动矩形,使每个矩形的左上角位置在点x,y 我不知道怎么做,我希望你能帮助我 谢谢Java 旋转矩形并调整位置,java,rotation,affinetransform,translate-animation,Java,Rotation,Affinetransform,Translate Animation,我目前正在努力解决一些矩形的旋转问题。 我有一个由9个小矩形组成的矩形。 现在我用仿射变换旋转了大矩形,效果很好。 我的问题是,我现在需要移动矩形,使每个矩形的左上角位置在点x,y 我不知道怎么做,我希望你能帮助我 谢谢 public class MainClass { public static void main(String[] args) { JFrame jf = new JFrame("Demo"); Container cp = jf.g
public class MainClass {
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
Container cp = jf.getContentPane();
MyCanvas tl = new MyCanvas();
cp.add(tl);
jf.setSize(800, 800);
jf.setVisible(true);
}
}
class MyCanvas extends JComponent {
private static final long serialVersionUID = 5703217428905757134L;
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int x = 400;
int y = 400;
int width = 100;
int height = 200;
final int OVERLAPPING_OUTLINE = 10;
Rectangle[] rect = new Rectangle[9];
rect[0] = new Rectangle(x + OVERLAPPING_OUTLINE, y + OVERLAPPING_OUTLINE, width - 2 * OVERLAPPING_OUTLINE, height - 2
* OVERLAPPING_OUTLINE);
rect[1] = new Rectangle(x - OVERLAPPING_OUTLINE, y - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
OVERLAPPING_OUTLINE * 2);
rect[2] = new Rectangle(x - OVERLAPPING_OUTLINE + width, y - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
OVERLAPPING_OUTLINE * 2);
rect[3] = new Rectangle(x - OVERLAPPING_OUTLINE, y + height - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
OVERLAPPING_OUTLINE * 2);
rect[4] = new Rectangle(x - OVERLAPPING_OUTLINE + width, y + height - OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2,
OVERLAPPING_OUTLINE * 2);
rect[5] = new Rectangle(x - OVERLAPPING_OUTLINE, y + OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2, height
- OVERLAPPING_OUTLINE * 2);
rect[6] = new Rectangle(x - OVERLAPPING_OUTLINE + width, y + OVERLAPPING_OUTLINE, OVERLAPPING_OUTLINE * 2, height
- OVERLAPPING_OUTLINE * 2);
rect[7] = new Rectangle(x + OVERLAPPING_OUTLINE, y - OVERLAPPING_OUTLINE, width - OVERLAPPING_OUTLINE * 2,
2 * OVERLAPPING_OUTLINE);
rect[8] = new Rectangle(x + OVERLAPPING_OUTLINE, y + height - OVERLAPPING_OUTLINE, width - OVERLAPPING_OUTLINE * 2,
2 * OVERLAPPING_OUTLINE);
for (Rectangle r : rect)
g2.draw(r);
g2.setColor(Color.RED);
AffineTransform af = new AffineTransform();
for (int i = 90; i < 360; i += 90) {
af.rotate(Math.toRadians(i), x - OVERLAPPING_OUTLINE, y - OVERLAPPING_OUTLINE);
for (Rectangle r : rect) {
Shape shape = af.createTransformedShape(r);
g2.draw(shape);
}
}
}
}
public类MainClass{
公共静态void main(字符串[]args){
JFrame jf=新JFrame(“演示”);
容器cp=jf.getContentPane();
MyCanvas tl=新的MyCanvas();
cp.add(tl);
jf.设置大小(800800);
jf.setVisible(真);
}
}
类MyCanvas扩展了JComponent{
私有静态最终长serialVersionUID=5703217428905757134L;
@凌驾
公共空间涂料(图g){
图形2d g2=(图形2d)g;
g2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
int x=400;
int y=400;
整数宽度=100;
整数高度=200;
最终int重叠_轮廓=10;
矩形[]矩形=新矩形[9];
rect[0]=新矩形(x+重叠轮廓,y+重叠轮廓,宽度-2*重叠轮廓,高度-2
*重叠轮廓);
rect[1]=新矩形(x-重叠轮廓,y-重叠轮廓,重叠轮廓*2,
重叠轮廓*2);
rect[2]=新矩形(x-重叠轮廓+宽度,y-重叠轮廓,重叠轮廓*2,
重叠轮廓*2);
rect[3]=新矩形(x-重叠轮廓,y+高度-重叠轮廓,重叠轮廓*2,
重叠轮廓*2);
rect[4]=新矩形(x-重叠轮廓+宽度,y+高度-重叠轮廓,重叠轮廓*2,
重叠轮廓*2);
rect[5]=新矩形(x-重叠轮廓,y+重叠轮廓,重叠轮廓*2,高度
-重叠轮廓*2);
rect[6]=新矩形(x-重叠轮廓+宽度,y+重叠轮廓,重叠轮廓*2,高度
-重叠轮廓*2);
rect[7]=新矩形(x+重叠轮廓,y-重叠轮廓,宽度-重叠轮廓*2,
2*重叠轮廓);
rect[8]=新矩形(x+重叠轮廓,y+高度-重叠轮廓,宽度-重叠轮廓*2,
2*重叠轮廓);
for(矩形r:rect)
g2.绘制(r);
g2.设置颜色(颜色为红色);
AffineTransform af=新的AffineTransform();
对于(int i=90;i<360;i+=90){
af.旋转(数学托拉半径(i),x-重叠轮廓,y-重叠轮廓);
for(矩形r:rect){
形状=af.createTransformedShape(r);
g2.绘制(形状);
}
}
}
}
看起来您需要使用仿射Transform.translate(双tx,双ty)