2012-03-28 4 views
1

는 내가 원하는 것은, 안에 다른 사각형을 고정하는 방법입니다 내가클램프 사각형 안에 큰 사각형

X = 0, Y = 0, Width = 25, Height = 25. 

와 함께 XNA 사각형이 있다고 가정하자 있도록 작은 사각형 결코 '잎'더 큰 하나의 경계 . 내가 가진 새로운 사각형을 만들 경우, 예를 들어

: 내가 가진 새로운 사각형을 만들 경우,

X = 23, Y = 20, Width = 2, Height = 5. 

또한 :

X = 23, Y = 20, Width = 10, Height = 10, 

내가 가진 사각형을 반환하는 방법을 원하는

X = -8, Y = 8, Width = 10, = 10, 

다음과 함께 사각형을 반환하는 메서드를 원합니다.

한편
X = 0, Y = 8, Width = 2, Height = 10. 

내가 일할 수있는 클램핑을 얻었다. 여전히, 그 추악한 코드의 대량, 그래서 새로운 질문은, 어떻게 이것을 단순화 할 수 있습니까?

if (SelectionRectangle.X < 0) 
     { 
      SelectionRectangle.Width = SelectionRectangle.Width + SelectionRectangle.X; 
      SelectionRectangle.X = 0; 
     } 
     if (SelectionRectangle.X + SelectionRectangle.Width > tileset.Width) 
     { 
      if (SelectionRectangle.X > tileset.Width) 
      { 
       SelectionRectangle.X = tileset.Width; 
       SelectionRectangle.Width = 0; 
      } 
      else 
      { 
       SelectionRectangle.Width = tileset.Width - SelectionRectangle.X; 
      } 
     } 
     if (SelectionRectangle.Y < 0) 
     { 
      SelectionRectangle.Height = SelectionRectangle.Height + SelectionRectangle.Y; 
      SelectionRectangle.Y = 0; 
     } 
     if (SelectionRectangle.Y + SelectionRectangle.Height > tileset.Height) 
     { 
      if (SelectionRectangle.Y > tileset.Height) 
      { 
       SelectionRectangle.Y = tileset.Height; 
       SelectionRectangle.Height = 0; 
      } 
      else 
      { 
       SelectionRectangle.Height = tileset.Height - SelectionRectangle.Y; 
      } 
     } 
+0

시도한 것을 보여줄 수 있습니까? 당신이 작성한 코드는 왜 작동하지 않았고, 당신의 문제는 무엇입니까? – TJHeuvel

+0

클램프를 적용 할 곳을 알려주십시오. –

답변

2

아니요 그냥 Rectangle.Intersect이 아닌가요?

하나의 사각형이 다른 사각형과 겹치는 영역을 정의하는 사각형을 만듭니다.

더 작은 직사각형이 완전히 큰 직사각형 내에 있으면 교차 부분은 더 작은 직사각형과 같습니다. 작은 사각형이 큰 사각형 외부로 확장되면 그 부분은 반환되지 않습니다.

+0

실제로이 방법은 지난 2 년간 간과되었습니다. 고맙습니다 – Taelia

0

어떻게 이런 일에 대해 :

Rectangle clamp(Rectangle smaller, Rectangle larger) 
    { 
     Rectangle ret; 
     ret.X = Math.Max(smaller.X, larger.X); 
     ret.Y = Math.Max(smaller.Y, larger.Y); 
     ret.Width = Math.Min(smaller.X + smaller.Width, larger.X + larger.Width) - ret.X; 
     ret.Height = Math.Min(smaller.Y + smaller.Height, larger.Y + larger.Height) - ret.Y; 
     return ret; 
    } 
0
private void ClampRectangle(Rectangle outside, Rectangle inside) { 
    if(inside.left < outside.left) { 
     inside.width -= outside.left - inside.left; 
     inside.left = outside.left 
    } 
    if(inside.right > outside.right) { 
     inside.width -= inside.right - outside.right; 
    } 
    if(inside.top < outside.top) { 
     inside.height -= outside.top - inside.top; 
     inside.top = outside.top; 
    } 
    if(inside.bottom > outside.bottom) { 
     inside.height -= inside.height - outside.height; 
    } 
} 

난 그냥 여기에 코드를 입력, 그래서 맞춤법 오류를 확인하십시오.
특성이 대문자인지 아닌지 (높이/높이 ...)

+0

하지만 내부면 어떻게 될까요? 오른쪽 = 23, 바깥 쪽. 오른쪽 = 25, 안쪽. 폭 = 말, 15? – Taelia

+0

'right'= 왼쪽 테두리 + 너비, 그래서 inner.Right GroundZero

관련 문제