2009-09-03 15 views
42

私はソース矩形とデスティネーション矩形を持っています。デスティネーション矩形内でフィッティングしながらソースをスケーリングできる最大スケールと、元のアスペクト比を維持するを見つける必要があります。1つの矩形を他の矩形内で可能な最大サイズに尺度変更するにはどうすればよいですか?

Googleが見つけたのはoneですが、すべてのケースで機能するかどうかはわかりません。ここに私の自家製ソリューションがあります:

  • 各矩形の高さ/幅を計算します。これにより、対角線の傾きはmsrcmdestになります。
  • msrc < mdst、スケールソース場合によって先に(スケール幅に合わせてスケールソース
  • そうでない場合には(スケール高同じ比率で)先にフィットします同じ比率)

この問題の他の解決策をお探しですか?私のアルゴリズムがすべての場合に機能するかどうかはわかりません!

答えて

84
scale = min(dst.width/src.width, dst.height/src.height) 

これはあなたのアプローチですが、よりきれいに書かれています。

+4

甘い!スケールを取得したら、次のようにして最終的な寸法を取得します: 'width = src.width * scale'と 'height = src.height * scale' –

+4

目的地全体をカバーしたい場合はmaxをminに変更します。 – Glogo

+6

同じ解決策ですが、私にはより明確な名前があります: 'scale = min(maxWidth/actualWidth、maxHeight/actualHeight)'、 'newWidth = actualWidth * scale'、' newHeight = actualHeight * scale' –

1
  1. その

によってdestWidth/srcWidthdestHeight/srcHeight

  • スケールの小さい方をうまく編集式の破片が周囲に移動すると、それは、もちろん、あなたの方法と同じです。私の意見はこれが意味論的にはっきりしているということですが、それは唯一の意見です。

    scale = (dst.width/src.width); 
    if (src.height * scale > dst.height) 
    scale = dst.height/src.height; 
    

    私はこの解決策を考える:

  • 10

    別のオプションはとてもスケールの高さ(またはその逆)であればスケールの高さが最大許容高さより大きいかどうかをチェックして、最大幅に拡張し、するかもしれませんより短く、より速く、理解しやすくなります。

    +0

    私はあなたの比率が3行目に反転していると思います。 – tom10

    +0

    あなたは間違いなしです。直した。 – Guss

    1

    すべてのディメンションがゼロでない場合は、次のコードを使用します(基本的にコードに一致します)。

    scaleFactor = (outerWidth/outerHeight > innerWidth/innerHeight) 
        ? outerHeight/innerHeight 
        : outerWidth/innerWidth 
    

    これを変更して、必要に応じて任意の次元をゼロにすることもできます。

    +1

    私は次元がゼロの矩形を「線」といいます。 :P – MusiGenesis

    +1

    この解決法は数学的に私のものと同じです。あなたの不等式に(innerHeight * outerHeight/innerWidth)を乗じれば、私の不等式が得られます。私のコードの利点は、不等式が失敗した場合、解を再計算する必要がないということです。 – Guss

    +0

    3項演算子は条件を1度だけ評価します。そして、もちろん、すべてのソリューションは数学的に同等でなければならない...または間違っている... –

    関連する問題