2015-01-02 28 views
9

JavaのRectangleクラスをプログラムで使用しています。矩形内の矩形を制限する

私は2つのRectangleオブジェクトがあります。長方形の

Rectangle big = new Rectangle(...); 
Rectangle small = new Rectangle(...); 

特定のサイズは重要ではありません。ただし、bigは常にsmallの幅と高さの両方で)です。

通常、smallは、完全にbigに含まれます。これを確認するにはRectangle#containsを使用できます。しかし、そうでない場合はへ移動smallは完全にbigに含まれています。いずれの矩形の寸法も変更しないでください。例えば

Rectangles Example

私はMath.maxMath.minで4つの条件文を使用することができます知っているが、これを行うための、よりエレガントな方法はありますか?

+0

はあなたがチェックしなければならない4つの条件があります(私はまた、おそらくインターフェースはメソッドadd(Rectangle)またはadd(SmallShape)を含んでいるでしょう。それを実装BigRectangleを持つ、インターフェースRectangleContainerまたはShapeContainerを作成します)ので、私はあなたができるかわかりません"束の条件文"なしで離れて... –

+0

真...しかし、おそらく 'Rectangle'クラスを使用して、おそらくエレガントな単一行の式を探していました。おそらくそれは不可能です。 – baum

+1

3進表記は、「少し」少しクリーナーまたはそれ以下になります。 – issathink

答えて

2

Math.maxMath.minとするとできます。このような何かを試してみてください:

small.setLocation(
    Math.max(Math.min(small.getX(),big.getX() - small.getWidth()),big.getX()), 
    Math.max(Math.min(small.getY(),big.getY() - small.getHeight()),big.getY()) 
); 

あなたはしかし、読みやすさを考慮しなければならないと思います。

+0

hmmです。私はおそらく私は交差点の反転を使用することができると思った...おそらくない。 – baum

+0

コンパクトですが、「エレガント」とは言わないものがあります –

+0

ええ、私は個人的には標準的なquadruple-ifsを使用しています。これは常に境界チェックに使用されているため、メンテナンスが必要なプログラマーはすぐに認識する必要があります。 – Ghostkeeper

2

より強いデザインが必要です。 Rectangleクラスを拡張する場合は、探している機能を正確に追加できます。どうやら「大きな長方形は」小さな長方形含む、コンテナとして行動しなければならない:今すぐ

class BigRectangle extends Rectangle { 
    //reference to or list of rectangle(s) here 

    private boolean isAlignedWith(Rectangle rect) { 
     return /* bounds logic */; 
    } 

    private void align(Rectangle rect) { 
     //move rectangle to proper position 
    } 

    public void add(Rectangle rect) { 
     if(!isAlignedWith(rect)) { 
      align(rect); 
     } 

     //store in reference or add to list 
    } 
} 

を、あなたは、単に1大きめに小さな四角形を追加することができます。

Rectangle smallRectangle = new Rectangle(); 
BigRectangle bigRectangle = new BigRectangle(); 
bigRectangle.add(smallRectangle); //automatically aligns if needed 

あなたは今(必要な)ロジックを隠し、コードの中央ユニットをきれいに保ちます。これはこれを処理する最もエレガントな方法の私の意見です。