-4

嗨,我尝试了一个问题来检查两个矩形是否相交如果矩形平行于 x 轴,我已经编写了代码

struct point 
{
 int x;
 int y;
};

struct rect
{
 struct point left;
 struct point right;
};

//1 - intersection
// 0- no intersection
int rectintersectioncheck(struct rect r1,struct rect r2)
{
    int x_check = (r1.left.x > r2.right.x || r2.left.x > r1.right.x);
    int y_check = (r1.right.y > r2.left.y || r2.right.y > r1.left.y);

    if(x_check && y_check )
    {
               return 0;   
    }
    return 1;
}

它在这种情况下工作正常,但我对算法感到困惑,因为矩形不平行于 x 轴,因为只有左上角,右下角点,请帮忙?

4

3 回答 3

1

先澄清一下。如果 p1 和 p2 是矩形的左上角和右下角点,则矩形必须平行于 x 轴(和 y 轴)。所以只有一个矩形满足这些条件。如果矩形不平行于 x 轴,则底部不能同时成为右点。

由于我们谈论的是不完全平行于 x 轴的矩形,所以让我们放弃这个定义。让我们谈谈两个相对顶点是 p1 和 p2(不一定是左上角和右下角)的矩形。

让 p1 和 p2 定义第一个矩形, p3 和 p4 定义第二个矩形。

如果你取所有对角为 p1 和 p2 的矩形的并集,你会得到一个圆(以 (p1+p2)/2 为中心,|p1−p2| 为直径)。

有以下三种情况:

  1. 如果 p1-p2 线段与 p3-p4 线段相交,则矩形始终相交。
  2. 如果对应于 p1,p2 的圆与对应于 p3,p4 的圆相交,那么这些矩形有时会相交。
  3. 否则这些矩形永远不会相交。
于 2012-09-12T11:34:09.370 回答
0

@ELKamina:您讨论的圆形方法非常好,但是在圆形相交但矩形不相交的情况下很难区分。

我已经想到了他的想法,很高兴分享。
为什么我们不在特定情况下在数组中构造我们的矩形以找出它们是否相交。

 eg.  rect 1- points (1,3)(3,1)(6,4)(4,6)     rect2 points- (4,0)(5,0)(5,1)(4,1)
array represntation                                      array representation
6 [F F F F # F F F]                                      6 [F F F F F F F F]
5 [F F F # # # F F]                                      5 [F F F F F F F F]
4 [F F # # # # # F]                                      4 [F F F F F F F F]
3 [F # # # # # F F]                                      3 [F F F F F F F F]
2 [F F # # # F F F]                                      2 [F F F F F F F F]
1 [F F F # F F F F]                                      1 [F F F F # # F F]
0 [F F F F F F F F]                                      0 [F F F F # # F F]
   0 1 2 3 4 5 6 7                                          0 1 2 3 4 5 6 7

在上述情况下,圆圈相交,但矩形不相交。

eg
g. rect 1- points (1,3)(3,1)(6,4)(4,6)     rect2 points- (3,0)(4,0)(3,1)(4,1)
 array represntation                                      array representation
6 [F F F F # F F F]                                      6 [F F F F F F F F]
5 [F F F # # # F F]                                      5 [F F F F F F F F]
4 [F F # # # # # F]                                      4 [F F F F F F F F]
3 [F # # # # # F F]                                      3 [F F F F F F F F]
2 [F F # # # F F F]                                      2 [F F F F F F F F]
1 [F F F # F F F F]                                      1 [F F F # # F F F]
0 [F F F F F F F F]                                      0 [F F F # # F F F]
   0 1 2 3 4 5 6 7                                          0 1 2 3 4 5 6 7 

在上述情况下 (3,1) 具有相同的值,因此可以发现它们相交。
类似的表示可以用来检查三角形是否相交。

于 2012-09-13T07:45:15.133 回答
-3

我将勾勒出答案。

  1. 旋转两个矩形,使一个与 x 轴对齐
  2. 然后,您可以计算出边缘的公式 (y=mx+c)
  3. 您还将知道另一个矩形的边的公式
  4. 看看有没有相交。

可以使用先前设置的链接执行旋转。

编辑

忘记平移 - 移动一个矩形以将 0,0 作为一个坐标。

于 2012-09-12T11:29:15.643 回答