为什么System.Drawing.Rectangle允许包含负大小(宽度,高度)?

时间:2019-06-09 03:34:53

标签: c# rectangles system.drawing

我了解到Rectangle(和RectangleF)ctor允许使用负数大小,但是我不明白为什么ctor不能在必须具有矩形的“实数值”中转换它,例如:

x:0, y:0, w:-100, h:200 == x:-100, y:0, w:100, h:200

以此类推。这没有道理。如果您在第一种情况下要求面积(宽x高),则会得到...负面积。如果您要求周边,那就彻底坏了。当逻辑和数学(基本数学)说“形状的大小不能为负数”时,它会迫使您编写很多样板Math.Abs

如果使用FromLTRB,则必须开始创建min和max,这是很多肮脏的代码。

.net团队以这种方式制作Rectangle ctor是否有任何微妙的原因?

最后,是否有任何包含的方法以“正确的方式”构建矩形?或者我必须做一个吗?

编辑:我发现了另一个问题,我将其称为错误;如果您使用负数x(例如:-100)和负数宽度(例如:-200),则会显示“我的权利是-300”。顶部和底部和左侧也一样。 ¡ 我能理解他对待底片尺寸的方式,但这对我来说是无法接受的。现在正确的不是正确的...

1 个答案:

答案 0 :(得分:0)

对我来说,具有负大小的矩形将仅仅是从其原点向左和向上延伸而不是在经典绘图中向右和向下延伸的矩形?对此没有任何限制,因为它只是4个数字的配对,并且对数字是否可以为负也没有限制-负宽度可能对您的应用有影响

尽管您无需在整个代码中进行很多复杂的数学运算;只需确定您要如何处理负值,并在实现规则的矩形结构周围创建包装器类即可。如果您决定宽度不为负,请包装矩形,设置一个属性或构造函数,该属性或构造函数在设置宽度时执行Abs,然后离开。每当您要绘制矩形时,请将其从包装器中取出

class Rectitive{
  private Rectangle r;
  public Rectangle R { get{return r}; private set; }

  public int Width { get { return r.Width } set { r.Width = math.Abs(value); } }

  public Rectitive(int x, int y, int w, int h){
    r = new Rectangle(Math.Abs(x) ...);
  }


}



e.Graphics.DrawRectangle(myRectitive.R);

请注意,这些是您定义的业务规则。如果我要编写一个处理负大小矩形的系统,我会将位置为50,70的-100,-200的矩形变成大小为-50,-130的100,200的矩形