矩形 - 一个数学问题

时间:2011-07-09 08:56:57

标签: math language-agnostic

我发现了一些不太有趣的矩形:

可以说,给出的是左,上,右和底坐标的值,所有这些坐标都是包容性的。

所以,计算宽度就像:

width = right - left + 1

到目前为止,如此合乎逻辑。但是!

宽度为零(有时是有意义的)必须存储为:

right = left - 1

在涉及以下操作时会产生问题:

  • 对矩形坐标进行排序(使其从左到右,从上到下)
  • 循环

好的,当然这些事情可以通过Width == 0的特殊情况使用额外的代码来处理,但是,严重的是,没有更好的解决方案,没有标准模式或最佳实践来处理这个问题吗?

编辑:

暂时我放弃了代码中坐标的“排序”,并用断言替换它,声明必须保留矩形 - >对,向上 - >下来,但认真......

5 个答案:

答案 0 :(得分:3)

要解决此问题,大多数图形库将从左侧坐标绘制矩形,但不包括右侧坐标。因此,如果left = 10且right = 20,则将绘制十个像素10到19。

您可以将此视为不是指向亮起部分的像素坐标,而是指像素之间的网格线

+---+---+---+
|   |   |   |
+---+---+---+
|   |   |   |
+---+---+---+
^   ^   ^   ^
0   1   2   3

答案 1 :(得分:2)

区分坐标像素非常重要。您可以将坐标系视为在像素之间运行的不可见网格。如果将矩形定义为{0,3,0,5},则以这种方式考虑坐标,然后按预期得到3像素乘5像素。

   |  |  |  |  |  |
0 -x--+--+--+--+--x-
   |  |  |  |  |  | 
1 -+--+--+--+--+--+-
   |  |  |  |  |  | <- pixels are rectangular areas between coordinate grid
2 -+--+--+--+--+--+-
   |  |  |  |  |  | 
3 -x--+--+--+--+--x-
   |  |  |  |  |  | 
   0  1  2  3  4  5

答案 2 :(得分:2)

如果边缘(左,右,顶部,底部)是包含的,那么根据定义,矩形的宽度(和高度)不能为0.通过“包括”边(这是一个像素),你'再说它必须至少有1个像素宽。

答案 3 :(得分:1)

当然你可以找到一个解决方法,但这里的问题实际上是超出范围

你的范围是一个矩形,即使宽度为零也会派上用场:没有宽度为零的矩形。

通常所有函数都有契约,并且docalculation(par_rectangle)函数的预测条件是par_rectangle实际上 是一个矩形。

如果你需要一个可以宽度为零的retangle- 之类的对象,你首先需要将它定义为防水,并且永远不要断言矩形的规则将适用于你的定义。

答案 4 :(得分:1)

说那个

  

所有这些坐标都是包容性的

表示实际上有两个不同的矩形,一个在另一个内。这就是你被抓住的地方:你写的时候

width = right - left + 1

它的确意味着:

inner_width = outer_right - outer_left + thickness

其中thickness是内外矩形的相应边之间的距离。

因此,要在抽象的数学意义上处理问题,你必须考虑两个矩形而不是一个。