矩形交叉算法

时间:2012-09-12 11:10:15

标签: c algorithm

您好我尝试了一个问题来检查两个矩形是否相交 如果矩形与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轴的情况下我很困惑algo 因为只有左上角,右边的底点被给予 请帮忙吗?

3 个答案:

答案 0 :(得分: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. 否则这些矩形永远不会相交。

答案 1 :(得分: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)中的

具有相同的值,因此可以发现它们相交 类似的表示可用于检查三角形是否相交。

答案 2 :(得分:-3)

我将勾勒出答案。

  1. 旋转两个矩形,使其与x轴一致
  2. 然后你可以计算出边缘的公式(y = mx + c)
  3. 您还将知道另一个矩形的边的公式
  4. 看看是否有任何交叉。
  5. 可以使用之前提出的链接执行旋转。

    修改

    忘记翻译 - 将一个矩形移动到0,0作为一个坐标。