0

2つの形状があり、ズームを実行したいので、次のコードを使用します

Iterator iter = objects.iterator();


    Shape shape;
    while(iter.hasNext()){
        shape = (Shape)iter.next();
        AffineTransform t = shape.getAffineTransform(); 
        int x = shape.getCenter().x;
        int y = shape.getCenter().y;            
        t.translate(-x, -y);
        t.scale(sx,sy);
        t.translate(x, y);
        shape.setAffineTransform(t);
    }

形状はズームされていますが、それらの間の距離は小さくなりました ズーム前 ゾミング後

2つの形状から複合形状を作成し、それを拡大縮小することを考えました。比率を維持する別の方法はありますか?ありがとう

4

4 に答える 4

2

コメントで述べたように、それぞれの中心を中心に形状をスケーリングするため、中心は明らかに動きません。すべてを均一にスケーリングしたい場合は、何も翻訳しないでください。

  1. 元のビューポートの中心点を見つけます。これは、ズームアウトする必要があるポイントです。
  2. (sx,sy) だけすべてを拡大します。
  3. ( origcentrex*(1-sx), origcentrey*(1-sy)) ですべてを平行移動して、中心点をビューポートの中心に戻します。

これらの変換を理解する最善の方法は、鉛筆と紙をつかみ、座標系を描き、紙に変換をたどることです。

于 2011-03-10T20:41:44.990 に答える
0

答えてくれてありがとう、私は私のために働く解決策を見つけました

    while(iter.hasNext()){
        shape = (Shape)iter.next();                     
        AffineTransform t = new AffineTransform();
        t.scale(sx,sy); 
        t.concatenate(shape.getAffineTransform());
        shape.setAffineTransform(t); 
    }
}
于 2011-03-11T00:27:41.587 に答える
0

あなたが持っているコードは、その中心について各形状をズームします。これは、下の線が下に移動し、上の線が上に移動することを意味します。一緒に動いているように見えるのはそのためです。

これが起こらないようにするには、下の境界 (上の形状の場合) と上の境界 (下の形状の場合) の点を中心に形状をズームする必要があります。「y」変数を適切な境界にします。

別の (および同等の) アプローチとして、ズームした後に各形状を適切な量だけ移動します。

于 2011-03-10T20:31:04.530 に答える
0

真のズームが必要な場合は、形状とそれらの間の空白をスケーリングすることを意味します。素朴な方法 (各形状を拡大縮小してから、ある形状から他のすべての形状までの距離を拡大縮小する) に従うと、結果は正しくありません。

私が知っている 1 つの方法は、2 つの形状の中心間の距離を、方向が固定された「引き付ける」力のベクトルとして扱うことです。次に、それらの力の大きさをスケーリングし、システムのバランスを再び取るポイントを見つけます。数学はどこかにあるはずです。私はそれをずっと前に見たので、別の人生のように思えました。

于 2011-03-10T21:30:02.477 に答える