【问题标题】:How to increase size of a rectangle如何增加矩形的大小
【发布时间】:2011-04-19 00:51:50
【问题描述】:

我想将矩形的大小增加 10 像素。以下代码似乎不起作用。假设 sampleRect 是我的矩形。请告诉我。

Rectangle temp = new Rectangle(
    sampleRect.X - 10, 
    sampleRect.Y - 10, 
    sampleRect.Width + 2*10, 
    sampleRect.Height + 2*10); 

【问题讨论】:

  • "下面的代码可以工作" 你是认真的吗?自己试试看吧!
  • 你的意思是“将大小增加 10 像素”?你 1) 想每边增加 10 个像素 2) 你想把面积增加 10 个像素吗?此外,您希望旧矩形保持在其中心位置还是横向增长?
  • @Josh:在慢速机器上编译和运行代码显然比在 SO 上询问要花费更长的时间,我猜......

标签: c# .net gdi


【解决方案1】:

它会起作用,但您可以使用Inflate method 更优雅地编写相同的东西:

rect.Inflate(10, 10);

您的方法和Inflate 方法之间的一个重要区别是您创建了一个新的矩形实例,而Inflate 修改了一个现有的矩形。

【讨论】:

  • 矩形是值类型;对它的更改不会影响其他人,因为他们(必然)将是副本。
  • @Ron 是否为值类型无关紧要;它不是一成不变的
  • @Josh:这不是不变性的情况;它是参考与值类型的一个案例。 Inflate 改变了他现有的 Rectangle 但没有其他代码可以保存对它的引用,因此除非他们重新读取它,否则它们将始终保持旧值。在 Tomas 的回答中,建议保存对现有矩形的引用的代码将自动看到变异值。
  • 关于值类型的好点 - 我删除了最后一句话(这仅对引用类型有意义)。可变值类型令人困惑!
  • @Ron 我的错……我明白你现在的意思了
【解决方案2】:

我不知道你为什么会问“这行得通” - 试试吧!

然而,

 someRectangle.Inflate(10,20);
 //or 
 someRectangle.Inflate(10);

应该工作

【讨论】:

  • 我认为没有任何 Inflate() 方法像第二个示例那样采用单个参数。
【解决方案3】:

根据您对“增长 10 像素”的定义,我会这样做:

int size = 10;
int halfSize = size/2;
Rectangle temp = new Rectangle(
    sampleRect.X - halfSize, 
    sampleRect.Y - halfSize, 
    sampleRect.Width + size, 
    sampleRect.Height + size); 

【讨论】:

    【解决方案4】:

    与 sampleRect 相比,您的代码将在 x,y -10 创建一个新的 Rectangle。为了补偿您将宽度和高度增加 20。

    我假设您正在尝试增加中心周围的矩形,在这种情况下,您需要将矩形移动新增加的一半。

    例子:

    var sizeIncrease = 10;
    var newX = sampleRect.X - 0.5 * sizeIncrease;
    var newY = sampleRect.Y - 0.5 * sizeIncrease;
    var newWidth = sampleRect.Width + sizeIncrease;
    var newHeight = sampleRect.Height + sizeIncrease;
    

    这些值应该可以为您提供所需的内容

    Rectangle.Inflate 也会改变中心周围的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 2017-03-02
      • 2017-09-09
      相关资源
      最近更新 更多