【发布时间】:2017-01-15 01:05:15
【问题描述】:
我很难弄清楚我的代码出了什么问题。实际上,我很难解决两个矩形重叠的问题。理论上,以下代码应该适用于以下矩形:
矩形 1:(2.5, 4) 宽度 = 2.5,高度 = 43
矩形 2:(1.5, 5) 宽度 = 0.5,高度 = 3
请记住,我不能使用 Rectangle 类来解决这个问题。我所做的是计算左右边缘的 x 值和两个矩形的顶部和底部边缘的 y 值。
我首先考虑的是——我知道这并不涵盖所有可能的情况——r2 在 r1 中的情况。
注意 (x1, y1) 和 (x2, y2) 分别表示矩形 1 和 2 的中心。
right1 = x1 + w1/2;
left1 = x1 - w1/2;
bottom1 = y1 - h1/2;
top1 = y1 + h1/2;
right2 = x2 + w2/2;
left2 = x2 - w2/2;
bottom2 = y2 - h2/2;
top2 = y2 + h2/2;
overlap = ( (right2 < right1 && right2 > left1) &&
(bottom2 > bottom1 && bottom2 < top1) &&
(left2 > left1 && left2 < right1) &&
(top2 < top1 && top2 > bottom1) );
我再次意识到这种情况并非包罗万象。但即使此时使用上述 Rect1 和 Rect2 值作为输入来测试一个矩形是否在另一个矩形内,重叠的计算结果为假......但它不应该——我已经完成了数学计算并建议代码应该可以工作。我做错了什么?
【问题讨论】:
-
“记住我不能使用 Rectangle 类来解决这个问题”不是为了提交,但是你可以用它来比较你的代码和一个已知的工作实现。这可能会帮助您找出问题所在。
-
您的变量名称非常零星/令人困惑。也许如果你仔细研究它们并选择更好的名字,你会发现任何轻微的计算问题。
-
@BrandonIbbotson 我的变量名有什么令人困惑的地方?左/右/上/下表示矩形的边缘,这些值的计算显示在上面的代码块中。 X1, Y1, X2, Y2 是中心,W1, H1, W2, H2 分别是宽度和高度。
-
尊重@BrandonIbbotson 所说的话。一个矩形完全由两个坐标 (x1, y1) 和 (x2, y2) 指定。这应该是您采用的符号,并且是坐标系中的自然表示,需要知道其中包含的矩形的位置。宽度和高度更多地与相对于特定矩形的坐标系有关。然后,“完全包含”的情况非常容易制定。来自广义相对论的背景,我了解到合适的坐标系是绝对关键的!
-
啊,我明白了,我认为出于某种原因它们是二维坐标。不过,
x1和w2等看起来有点奇怪。您应该问自己诸如... “为什么right1设置为x1 + w1/2?不应该只是 @987654326 @?”使用更清晰的变量名,这个过程会更加明显。