2012-03-28 137 views
1

可以说我有一个XNA矩形与钳矩形内较大的矩形

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

我想是内部夹具另一个矩形的方法,使小矩形从不“叶子”中较大的边界。

例如,如果我提出一个新的Rectangle有:

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

我想返回具有矩形的方法:

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

而且,如果我做一个新的Rectangle有:

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 2012-03-28 13:19:41

+0

你能告诉我们你在哪里使用夹子吗? – 2012-03-28 13:20:38

回答

2

难道不是这只是Rectangle.Intersect

建立一个矩形限定,其中一个矩形重叠的另一矩形的区域。

如果较小的矩形完全在较大的矩形内,那么交点将与较小的矩形相同。如果较小的矩形延伸到较大的矩形外部,则该部分不会被返回。

+0

实际上,我在过去的两年中忽略了这种方法。谢谢 – Taelia 2012-03-28 14:54:43

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

但是如果inside.Right = 23,outside.Right = 25,inside.Width = say,15? – Taelia 2012-03-28 13:34:05

+0

'right'= left border + width,所以如果inside.Right GroundZero 2012-03-28 18:22:07