2

私は Java Swing で形状を回転および平行移動するコマンド パターンです。平行移動と回転は別々にうまく機能しますが、60 度を実行すると、回転、次に平行移動、平行移動は新しい回転座標に従います。つまり、マウスをドラッグすると、マウスの移動ベクトルから 60 度のギャップで形状が移動します。簡単な解決策はありますか? 助けてください、私はここで壁にぶつかっています

ローテーションの実行方法

public void execute() {  
    System.out.println("command: rotate " + thetaDegrees );       
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();           
        mt.addMememto(shape);             
        AffineTransform t =  shape.getAffineTransform();      
        t.rotate(Math.toRadians(thetaDegrees), shape.getCenter().x, shape.getCenter().y);  
        shape.setAffineTransform(t);              
    }  
}  

翻訳のための私の実行方法

public void execute() {  
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();  
        mt.addMememto(shape);  
        AffineTransform t = shape.getAffineTransform();  
        System.out.println("Translation x :"+x + ", Translation y :"+y);  
        t.translate(x,y);  
        shape.setAffineTransform(t);  
    }  
} 

どんな助けでも本当に感謝できます

4

2 に答える 2

5

「その場での」回転 (オブジェクトが独自の軸を中心に回転する) を行うには、次の操作を行う必要があります。

  1. オブジェクトを原点に変換します
  2. 回転を適用する
  3. 元の位置に戻す
  4. 希望の翻訳を適用する

手順 3 と 4 は一度に適用できることに注意してください。

原点以外の位置で回転を試みると、オブジェクトが原点を中心に回転しているように見える「回転」効果が得られます。

于 2011-02-05T05:48:44.597 に答える
1

形状の中心を中心に適切に回転するために、形状のオフセットを考慮した特別な回転機能を使用しています。ただし、形状の方向を考慮するために、変換関数に対して同様のことを行う必要があります。

代わりに、翻訳関数でこれを試してください。

public void execute() {  
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();  
        mt.addMememto(shape);  
        AffineTransform t = new AffineTransform();
        System.out.println("Translation x :"+x + ", Translation y :"+y);
        t.translate(x,y);
        t.concatenate(shape.getAffineTransform());
        shape.setAffineTransform(t);  
    }  
}

これにより、元の座標系で変換が実行されます。

于 2011-02-05T05:59:31.600 に答える