将矩形夹在较大的矩形内
本文关键字: | 更新日期: 2023-09-27 18:29:28
假设我有一个带有的XNA矩形
X = 0, Y = 0, Width = 25, Height = 25.
我想要的是一种将另一个矩形夹在里面的方法,这样较小的矩形就不会"离开"较大矩形的边界。
例如,如果我用制作一个新的矩形
X = 23, Y = 20, Width = 10, Height = 10,
我希望该方法返回一个矩形:
X = 23, Y = 20, Width = 2, Height = 5.
此外,如果我用制作一个新的矩形
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;
}
}
这不就是Rectangle.Intersect
吗?
创建一个矩形,定义一个矩形与另一个矩形重叠的区域。
如果较小的矩形完全在较大的矩形内,则交点将与较小的矩形相同。如果较小的矩形延伸到较大的矩形之外,则不会返回该部分。
这样的东西怎么样:
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;
}
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;
}
}
我刚在这里输入了代码,所以请检查拼写错误
我不确定属性是否有大写字母(height/height…)