判断两个矩形相交

假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形
    rect1{(minx1, miny1)(maxx1, maxy1)}
    rect2{(minx2, miny2)(maxx2, maxy2)}  
相交的结果一定是个矩形,构成这个相交矩形rect{(minx, miny) (maxx, maxy)}的点对坐标是:  
    minx   =   max(minx1,   minx2)  
    miny   =   max(miny1,   miny2)  
    maxx   =   min(maxx1,   maxx2)  
    maxy   =   min(maxy1,   maxy2)  
   
如果两个矩形不相交,那么计算得到的点对坐标必然满足:  
  ( minx  >  maxx ) 或者 ( miny  >  maxy ) 
   
判定是否相交,以及相交矩形是什么都可以用这个方法一体计算完成。

从这个算法的结果上,我们还可以简单的生成出下面的两个内容:

㈠ 相交矩形:  (minx, miny) (maxx, maxy)

㈡ 面积: 面积的计算可以和判定一起进行         if ( minx>maxx ) return 0;         if ( miny>maxy ) return 0;         return (maxx-minx)*(maxy-miny)

第二种方法

两个矩形相交的条件:两个矩形的重心距离在X和Y轴上都小于两个矩形长或宽的一半之和.这样,分两次判断一下就行了.

即:重心距离在X轴上投影长度 < 两个矩形的在X轴的长度之和/2

重心距离在Y轴上投影长度 < 两个矩形在Y轴的宽度之和/2

bool CrossLine(Rect r1,RECT r2) { if(abs((r1.x1+r1.x2)/2-(r2.x1+r2.x2)/2)<((r1.x2+r2.x2-r1.x1-r2.x1)/2) && abs((r1.y1+r1.y2)/2-(r2.y1+r2.y2)/2)<((r1.y2+r2.y2-r1.y1-r2.y1)/2)) return true; return false;

http://www.cnblogs.com/0001/archive/2010/05/04/1726905.html

}

时间: 2024-11-01 15:59:50

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

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

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

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

两个矩形相交问题-判断是否相交

最近,面试遇到一道算法题目如下: 两个矩形,判断是否相交:如果相交面积大于零,输出相交部分的左上角以及右下角坐标点,否则,输出(-1,-1,-1,-1) 没有给出完善的解决答案,在面试官的细心引导下,解决了两个线段相交输出交点的问题.因此下来在网上搜了相关的问题. 1)下面是转自https://blog.csdn.net/szfhy/article/details/49740191判断两个矩形是否相交的方法: 下图是两个矩形相交的5种情况: 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是

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物

如何判断单链表是否存在环 &amp; 判断两链表是否相交

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

判断两线段是否相交

今日集训第一日,遇到了判断线段相交问题.跟面积问题一样,这个同样可以用叉积来解决. 数学原理证明: 首先引出计算几何学中一个最基本的问题:如何判断向量在的顺时针方向还是逆时针方向? 把p0定为原点,p1的坐标是(x1,y1),p2的坐标是(x2,y2).向量的叉积(cross product)实际上就是矩阵的行列式: 代码实现: 1 int direction(Point p0, Point p1, Point p2) { 2 int px02 = p2.x - p0.x; 3 int py02

&lt;笔试&gt;&lt;面试&gt;C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)

判断两链表是否相交,求交点(假设链表不带环) 判断两链表是否相交,求交点(假设链表可能带环) RingEntry_Point()等函数见前篇. SListNode* Intersect(SListNode *&L, SListNode *&M)//判断两链表是否相交,求交点(假设链表不带环) {  //思路:若不带环,只有相交/不想交两种情况  // 与RingEntry_Point()函数方法相同:  //     求两个链表长度之差K,再令一个指针从长链表开始先走K步,令另一个指针从短

向量叉积判断两线段是否相交

判断两直线p1p2与q1q2是否相交,用向量叉积来判断 如果P x Q >0,则P在Q的顺时针方向: 如果P x Q <0,则P在Q的逆时针方向: 如果P x Q=0,则P与Q共线,可能同向也可能反向 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> typedef struct node {

判断两个矩形是否相交

说矩形相交算法之前,先看下如何判断两条线段是否相交 如果有两条线段 [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),否则就是不相交了),即两条线段中起点大的