我写了这两个用于校正矩形。例如,如果矩形具有以下属性:
X:32,Y:32,宽度:-32,高度:-32
这将使矩形X:0,Y:0,宽度:32,高度:32
if (r.Width < 0)
{
r.X -= Math.Abs(r.Width);
r.Width = Math.Abs(r.Width);
}
if (r.Height < 0)
{
r.Y -= Math.Abs(r.Height);
r.Height = Math.Abs(r.Height);
}
这是#2
r.X -= Math.Abs(Math.Min(0, r.Width));
r.Width = Math.Abs(r.Width);
r.Y -= Math.Abs(Math.Min(0, r.Height));
r.Height = Math.Abs(r.Height);
他们都工作得很好。我的问题是哪个?我觉得第一个可能更快,更可读,但第二个代码行更少。而且,我觉得这可能是已经发明的东西。是否有一种方法可以在.NET或XNA Framework中执行此操作?
谢谢!
编辑:有人发布了第二种方式的缩短版本,我非常喜欢并将其合并到此:
r = new Rectangle(r.X + Math.Min(0, r.Width), r.Y + Math.Min(0, r.Height), Math.Abs(r.Width), Math.Abs(r.Height));
老实说,我更喜欢更少的线路,我不认为这太复杂了。如果有的话,我可以发表评论或将其封装到具有描述性名称的方法中。
答案 0 :(得分:3)
如果你知道r.Width和r.Height是&lt; 0为什么你需要对他们进行Abs?删除它,它会更快,更简单。
if (r.Width < 0)
{
r.X += r.Width;
r.Width = -r.Width;
}
if (r.Height < 0)
{
r.Y += r.Height;
r.Height = -r.Height;
}
恕我直言,你写这篇文章的第二种方式简直就是丑陋。你不看它,立刻意识到它在做什么。记住KISS。
编辑:我理解你喜欢你的代码尽可能少,所以我重新设计了上面的代码:if (r.Width < 0) { r.X += r.Width; r.Width = -r.Width; } if (r.Height < 0) { r.Y += Height; r.Height = -r.Height; }
同样简单 - 并且只需一行代码!线路上的角色甚至比你的替代品还要少......
行数通常不是编程美的一个很好的衡量标准 - 但当然这是你的代码所以你必须选择带给你最大乐趣的东西。
答案 1 :(得分:1)
第一个更具可读性,它也应该稍快一点,因为如果没有任何事情可以做得更少。
在检查值是否为负数后,您知道它们是否定的,因此您不需要任何Math.Abs
:
if (r.Width < 0) {
r.Width = -r.Width;
r.X -= r.Width;
}
if (r.Height < 0) {
r.Height = -r.Height;
r.Y -= r.Height;
}
为了完整起见,第二个也可以写成Math.Abs
次呼叫,因为你知道Math.Min
当它不为零时出现的信号:
r.X += Math.Min(0, r.Width);
r.Width = Math.Abs(r.Width);
r.Y += Math.Min(0, r.Height);
r.Height = Math.Abs(r.Height);