【问题标题】:Two overlapping rectangles两个重叠的矩形
【发布时间】: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) 指定。这应该是您采用的符号,并且是坐标系中的自然表示,需要知道其中包含的矩形的位置。宽度和高度更多地与相对于特定矩形的坐标系有关。然后,“完全包含”的情况非常容易制定。来自广义相对论的背景,我了解到合适的坐标系是绝对关键的!
  • 啊,我明白了,我认为出于某种原因它们是二维坐标。不过,x1w2 等看起来有点奇怪。您应该问自己诸如... “为什么 right1 设置为 x1 + w1/2不应该只是 @987654326 @?”使用更清晰的变量名,这个过程会更加明显。

标签: java overlap


【解决方案1】:

如果矩形的水平边和垂直边之间有一些交叉点,矩形就会重叠 - 所以基本上这是检查两条线是否在每个维度上重叠的情况。

检查 x1 -> x2 行是否与 x3 -> x4 行重叠是第一行是否在第二行结束之前开始并在其开始之后结束,或者在代码中:

x1 <= x4 && x2 >= x3

要将其转换为矩形,请将测试应用于两个维度:

(x1 <= x4 && x2 >= x3) && (y1 <= y4 && y2 >= y3)

..其中一个矩形是 x1,y1 -> x2,y2,另一个是 x3,y3 -> x4,y4(很容易从起始位置和宽度计算得出)。

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 2017-05-13
    • 2023-03-18
    • 2018-09-29
    • 1970-01-01
    • 2011-09-14
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多