我发现了一些不太有趣的矩形:
可以说,给出的是左,上,右和底坐标的值,所有这些坐标都是包容性的。
所以,计算宽度就像:
width = right - left + 1
到目前为止,如此合乎逻辑。但是!
宽度为零(有时是有意义的)必须存储为:
right = left - 1
在涉及以下操作时会产生问题:
好的,当然这些事情可以通过Width == 0
的特殊情况使用额外的代码来处理,但是,严重的是,没有更好的解决方案,没有标准模式或最佳实践来处理这个问题吗?
编辑:
暂时我放弃了代码中坐标的“排序”,并用断言替换它,声明必须保留矩形 - >对,向上 - >下来,但认真......
答案 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
是内外矩形的相应边之间的距离。
因此,要在抽象的数学意义上处理问题,你必须考虑两个矩形而不是一个。