2015-01-02 3 views
9

프로그램에서 Java의 Rectangle 클래스를 사용하고 있습니다.사각형 내 사각형 구속

나는 두 Rectangle 객체가 : 사각형의

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

특정 크기는 중요하지 않습니다. 그러나 big은 항상 small보다 클 것입니다 (의 너비와 높이는 모두입니다).

보통 small은 전체적으로 big에 포함됩니다. 이를 확인하려면 Rectangle#contains을 사용할 수 있습니다. 그러나 그렇지 않은 경우 small으로 이동하려면 big에 전적으로 포함되어 있습니다. 직사각형의 치수가 변경되지 않아야합니다. 예를 들어

:

Rectangles Example

내가 Math.maxMath.min 4 개 개의 조건문을 사용할 수 있습니다 알고 있지만,이 일을 더 우아한 방법이?

+0

당신이 확인해야 할 네 가지 조건이 있습니다 (나는 또한 아마 인터페이스는 방법 add(Rectangle) 또는 add(SmallShape) 포함됩니다. 그 구현 BigRectangle을 가진, 인터페이스 RectangleContainer 또는 ShapeContainer을 만들 것입니다), 그래서 당신이 할 수있는 확실하지 않다 "조건 집합"이 없으면 벗어나십시오 ... –

+0

True ...하지만 아마도 'Rectangle' 클래스를 사용하여 우아한 한 줄짜리 표현식을 찾고있을 것입니다. 아마 불가능합니다. – baum

+1

삼항 표현식은 "조금"깨끗하게 또는 더 짧게 표현됩니다. – 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

흠, 그게 제가 두려워하는 것입니다. 나는 아마 내가 교차로의 반전을 사용할 수 있다고 생각했다. .. 아마 그렇지 않을지도 모른다. – baum

+0

좀 더 컴팩트하지만, "우아한"이라고 부르는 것이 아닙니다. –

+0

그래, 저는 개인적으로 표준 쿼드 러플-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 
    } 
} 

을, 당신은 단순히 하나의 큰에 작은 사각형을 추가 할 수 있습니다

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

당신은 지금 (필요한) 논리를 숨기고 중앙 코드 단위를 깨끗하게 유지합니다. 이것은 이것을 처리하는 가장 우아한 방법에 대한 제 의견입니다.