判断两个矩形是否相交

说矩形相交算法之前,先看下如何判断两条线段是否相交

如果有两条线段 [a, b],[c, d](a, b, c, d 为 X 轴坐标点),有下面两种不相交的情况:
1)b < c 时,线段 [a, b] 在 [c, d] 的左边不相交
2)d < a 时,线段 [a, b] 在 [c, d] 的右边不相交
把上面两种情况取反就是相交的情况。
相交的线段则可以表示为[min(a, c), min(b, d)](注意:min(b, d) 应大于 min(a, c),否则就是不相交了),即两条线段中起点大的和终点小的。
写成程序如果下所示(程序中用的结构体表示是起点和长度):

#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))
struct section
{
    int start;
    int length;
};
/* determine if the two input section intersect with each other */
static int section_intersect(struct section sec1, struct section sec2)
{
    /*return !(sec1.start > sec2.start + sec2.length
            || sec2.start > sec1.start + sec1.length);*/
    return sec1.start < sec2.start + sec2.length
        && sec2.start < sec1.start + sec1.length;
}
static void section_intersect_test()
{
    struct section sec1 = {5, 5};
    struct section sec2 = {7, 8};
    struct section sec3 = {18, 3};
    printf("sec1 ^ sec2 : %d\n", section_intersect(sec1, sec2));
    printf("sec1 ^ sec3 : %d\n", section_intersect(sec1, sec3));
    printf("sec2 ^ sec3 : %d\n", section_intersect(sec2, sec3));
}
/* return the intersection of the two input, if not intersect, return a emtpy section */
static struct section section_intersection(struct section sec1, struct section sec2)
{
    struct section sec = {0, 0};
    int start = max(sec1.start, sec2.start);
    int end = min(sec1.start + sec1.length, sec2.start + sec2.length);
    if (end >= start)
    {
        sec.start = start;
        sec.length = end - start;
    }
    return sec;
}
static void print_section(const char *pcstr, struct section sec)
{
    printf("%s {%d, %d}\n", pcstr, sec.start, sec.length);
}
static void section_intersection_test()
{
    struct section sec1 = {5, 5};
    struct section sec2 = {7, 8};
    struct section sec3 = {18, 3};
    print_section("sec1 ^ sec2 :", section_intersection(sec1, sec2));
    print_section("sec1 ^ sec3 :", section_intersection(sec1, sec3));
    print_section("sec2 ^ sec3 :", section_intersection(sec2, sec3));
}
static void test_driver()
{
    section_intersect_test();
    section_intersection_test();
}

说明:
section_intersect 判断两条线段是否相交,如果不相交返回 0。它里面的注释部分和没有注释的部分的意思等同。
section_intersect_test 是对 section_intersect 的简单测试。
section_intersection 返回两条线段相交的部分,如果不相交,返回一个空线段(起点为 0,长度为 0)。
section_intersection_test 是对 section_intersection 的简单测试。

判断矩形是否相交与之类似,因为矩形是由相互垂直的两条线段确定的。
代码如下:

struct rectangle
{
    int x;
    int y;
    int width;
    int height;
};
static int rectangle_intersect(struct rectangle rec1, struct rectangle rec2)
{
    return rec1.x < rec2.x + rec2.width
        && rec2.x < rec1.x + rec1.width
        && rec1.y < rec2.y + rec2.height
        && rec2.y < rec1.y + rec1.height;
}
static struct rectangle rectangle_intersection(struct rectangle rec1, struct rectangle rec2)
{
    struct rectangle rec = {0, 0, 0, 0};
    int x1 = max(rec1.x, rec2.x);
    int x2 = min(rec1.x + rec1.width, rec2.x + rec2.width);
    int y1 = max(rec1.y, rec2.y);
    int y2 = min(rec1.y + rec1.height, rec2.y + rec2.height);
    if (x2 >= x1 && y2 >= y1)
    {
        rec.x = x1;
        rec.y = y1;
        rec.width = x2 - x1;
        rec.height = y2 - y1;
    }
    return rec;
}

说明,以上的代码都没有经过严格的测试,只为了说明线段矩阵相交算法。

时间: 2024-12-28 21:08:18

判断两个矩形是否相交的相关文章

C语言——结构体数组的使用案例(如何判断两个矩形是否相交,其中一个是否包含在另外一个里面,点是否在矩形中)

Rect.h struct CPoint { float x; float y; }; typedef struct CPoint CPoint; struct CSize { float width; float height; }; typedef struct CSize CSize; struct CRect { CPoint origin; CSize size; }; typedef struct CRect CRect; //判断两个矩形是否相交 BOOL isIntersecti

PHP判断两个矩形是否相交

<?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的. Case 2345中,两个中心点间的距离肯定小于AB边长和的一半. Case 1中就像等了. 设A[x01,y01,x02,y02]  B[x11,y11,x12,y12]. 矩形A和矩形B物理中心点X方向的距离为Lx:abs( (x01+x02)/2 – (x11+x12) /2) 矩形A和矩形B物

判断两个线段是否相交

我们的问题是这样的:给定一条线段的起点为$A_1$.终点为$A_2$,另一条线段的起点为$B_1$.终点为$B_2$,问线段$A_1A_2$和线段$B_1B_2$是否相交? 我们首先解释一下,两条线段相交的概念是指,存在一个点,这个点同时在两条线段上. 方法一(解方程法): 容易知道,线段$A_1A_2$上的点的集合为$A = A_1 * (1 - r_1) + A_2 * r_1$,其中$r_1 \in [0, 1]$:同理,线段$B_1B_2$上的点的集合为$B = B_1 * (1 - r

判断两个矩形相交以及求出相交的区域

问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2).(1)设计一个算法,确定两个矩形是否相交(即有重叠区域)(2)如果两个矩形相交,设计一个算法,求出相交的区域矩形 (1)       对于这个问题,一般的思路就是判断一个矩形的四个顶点是否在另一个矩形的区域内.这个思路最简单,但是效率不高,并且存在错误,错误在哪里,下面分析一 下. 如上图,把矩形的相交(区域重叠)分成三种(可

poj1410(判断线段和矩形是否相交)

题目链接:https://vjudge.net/problem/POJ-1410 题意:判断线段和矩形是否相交. 思路:注意这里的相交包括线段在矩形内,因此先判断线段与矩形的边是否相交,再判断线段的两端点是否在矩形内(因为是矩形,即凸多边形,直接用叉积判断即可,如果是一般的多边形,需要用射线法判断.) AC code: #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib>

poj1039——计算几何 求直线与线段交点,判断两条直线是否相交

poj1039——计算几何  求直线与线段交点,判断两条直线是否相交 Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9439   Accepted: 2854 Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the de

编程之美---判断两个链表是否相交

首先,判断一个链表是否有环? 对于这个问题:可以用两个指针,刚开始都指向头节点,然后一个指针每次向后移一步,另一个指针每次向后移两步,如果最后移两步的指针为空时,说明无环,如果最后两个指针相等,说明有环.如果把第一指针看成静止,则相当于第二个每次走一步,所以在那个环上时,是一定能相遇的. 如何找到这个链表环的入口? 当这两个指针相遇后,把第一个指针移向头,两个指针每次都只移一步,再次相等时,就是环的入口.证明:设环上相遇位置为距离环入口处P,入口处前有M个节点,,环肾功能有N个节点,从入口处开始

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

【IT公司100题-7】-判断两个链表是否相交

问题:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.1.如何判断一个链表是不是这类链表? 问题扩展:1.如果链表可能有环呢?2.如果需要求出两个链表相交的第一个节点呢? 分析: 在无环的情况下,如果两个链表有结点相同,那么它们下一结点也相同,如此可推出尾结点也相同. 那么只要判断两链表的尾结点是否相同.(O(len1+len2)) 1 struct Node { 2 int data; 3 int Node *next; 4 };