2012-12-12 41 views
1

我有一个Arraylist对象,其中包含我想要使用Graphics2D在屏幕上绘制的对象的位置和旋转。如何在Java中正确旋转多个对象?

public void render(Graphics g1) { 
Graphics2D g = (Graphics2D) g1; 
g.setColor(Color.white); 
for(PhysicObject object : entities) { 

if (object.getBody().getType() == BodyType.DYNAMIC) { 
      Vec2 position = object.getBody().getPosition().mul(30); 
      g.translate(position.x, position.y); 
      g.rotate(object.getBody().getAngle()); 
      g.fillRect((int)-(object.width), (int)-(object.height), (int)(object.width*2), (int)(object.height*2)); 
     } 
    } 

} 

第一个对象总是旋转正确,但下面的内容围绕第一个旋转而不是围绕自己。

希望有人能帮助我,谢谢。

回答

5

要独立旋转每个对象,必须撤消第一个对象的平移和旋转。所以最简单的方法是使用AffineTransform来“结合”这两个转换并简化它们的撤销。例如

AffineTransform t = new AffineTransform(); 
    t.translate(position.x, position.y);   
    t.rotate(object.getBody().getAngle()); 
    g.transform(t); 
    g.fillRect((int)-(object.width), (int)-(object.height), (int)(object.width*2), (int)(object.height*2)); 
    try{ 
     g.transform(t.createInverse()); 
    }catch(NoninvertibleTransformException e){ 
     //... 
    } 

的createInverse()创建了“相反”转化,并返回图形空间到其原始状态。然后下一个转换应该可以正常工作。

+0

非常感谢你! – user1734282

0

当您translaterotate这会永久影响您的图形对象。请务必在拨打fillRect之后将原始来源和方向转换并旋转至原始位置。

g.translate(-position.x, -position.y); 
g.rotate(-object.getBody().getAngle()); 
0

不要使用Graphics上下文旋转方法,而应尝试使用AffineTransformation

您将需要重置每个循环上的变换。

什么会更好是利用形状API和改造形状,而不是