【问题标题】:Why System.Drawing.Rectangle allow contain negative sizes (width, height)?为什么 System.Drawing.Rectangle 允许包含负尺寸(宽度、高度)?
【发布时间】:2019-06-09 03:34:53
【问题描述】:

我知道 Rectangle(和 RectangleF)ctor 允许负尺寸,但我不明白为什么 ctor 不将其转换为必须具有矩形的“实际值”,例如:

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

等等。这没有意义。如果您在第一种情况下要求面积(W x H),您会得到......负面积。如果你要求周长,那么它就完全坏了。当逻辑和数学(基本数学)说“形状的大小不能为负数”时,它会迫使您编写大量样板文件Math.Abs

如果你使用FromLTRB,那么你必须开始制作最小值和最大值,这是很多脏代码。

.net 团队以这种方式制作 Rectangle ctor 有什么微妙的原因吗?

最后,是否有任何包含“以正确方式”构建矩形的方法,还是我必须这样做?

编辑:我发现了另一个问题,我称之为错误;如果您使用负 x(例如:-100)和负宽度(例如:-200),它会显示“我的权利是 -300”。与顶部和底部和左侧相同。好的! 我可以理解他对待底片尺寸的方式,但这对我来说似乎是不可接受的。现在正确的不是正确的......

【问题讨论】:

  • 不同的用例可能有不同的策略。例如,您可能有一个代表屏幕的一部分的矩形,并且您根据进入该空间的内容来缩小矩形。如果你有太多东西,矩形的宽度会变成负数,比如上面显示的-100。这真的意味着 100 像素的内容有空间吗?不,这意味着你的空间用完了,宽度应该被视为零。此外,宽度可能会变为负数,但只是暂时的。例如,减去 50 个像素然后加上 50 个像素应该是一个 nop。
  • 矩形(和其他结构)不仅仅用于绘图。它们可用于任何类型的计算。这就像想知道为什么会有负数,因为你不能花 -10 美元,所以为了你的方便,something 应该变成正数。
  • @Jimi 我明白,但是,如果我问矩形“嘿,你的宽度是多少?”我希望(恕我直言)一个“可能的”值,一个正值:宽度为 100,不同的是方向是“向左”。但是好的,我明白了,我已经构建了一个静态函数来满足我的要求。
  • @Jimi 你觉得我的编辑怎么样,你觉得还可以吗?
  • 如果矩形是镜像的,那么-300 的右边就是右边。这在简单的矩形形状的情况下没有太大区别,因为无论您以这种方式或那种方式绘制它看起来都一样,但是考虑一个汽车的矩形图像,正确的方式(车牌可读)。现在用户抓住右手手柄并将矩形的右侧拖过原点并从另一侧拖出到-300。右侧仍然是右侧,但现在在视觉上位于左侧(汽车的右侧仍然是右侧),并且车牌向后。

标签: c# rectangles system.drawing


【解决方案1】:

对我来说,负尺寸的矩形只是从其原点向左和向上延伸而不是在经典绘图中向右和向下延伸的矩形?不过它没有任何限制,因为它只是 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 的矩形

【讨论】:

  • 答案的最后一部分是我认为所有这一切中唯一有意义的事情。如果一个矩形的尺寸为负数,则有一个完全相等的矩形,所有尺寸均为正数(与左上角交换起点)。那么,为什么要使用负尺寸?告诉“嘿,这个矩形从原点向上和离开”这么重要吗?我将制作一个静态的构建方法。谢谢。
  • 我想这更多是由于矩形是如何生成的。您可能有一个形状,用户已向上/向左拖出或通过从现有的右下角一直移动到原点并进入新的左上角来调整大小。您甚至可以选择将尺寸保持为负值,以表示在具有方向的物体(例如图像)上发生了翻转/镜像 - 它甚至可能是您的用户翻转物体的方式 - 他们希望图像倒置,抓住底部手柄并将其一直拖到 0 高度然后继续前进,使图像具有 -100 高度
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2012-03-19
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多