矩形相交以及求出相交的区域的原理解析_其它综合

(1)设计一个算法,确定两个矩形是否相交(即有重叠区域)
(2)如果两个矩形相交,设计一个算法,求出相交的区域矩形

(1) 对于这个问题,一般的思路就是判断一个矩形的四个顶点是否在另一个矩形的区域内。这个思路最简单,但是效率不高,并且存在错误,错误在哪里,下面分析一 下。

如上图,把矩形的相交(区域重叠)分成三种(可能也有其他划分),对于第三种情况,如图中的(3),两个矩形相交,但并不存在一个矩形的顶点在另一个矩形 内部。所以那种思路存在一个错误,对于这种情况的相交则检查不出。

仔细观察上图,想到另一种思路,那就是判断两个矩形的中心坐标的水平和垂直距离,只要这两个值满足某种条件就可以相交。
矩形A的宽 Wa = Xa2-Xa1 高 Ha = Ya2-Ya1
矩形B的宽 Wb = Xb2-Xb1 高 Hb = Yb2-Yb1
矩形A的中心坐标 (Xa3,Ya3) = ( (Xa2+Xa1)/2 ,(Ya2+Ya1)/2 )
矩形B的中心坐标 (Xb3,Yb3) = ( (Xb2+Xb1)/2 ,(Yb2+Yb1)/2 )
所以只要同时满足下面两个式子,就可以说明两个矩形相交。1) | Xb3-Xa3 | <= Wa/2 + Wb/2
2) | Yb3-Ya3 | <= Ha/2 + Hb/2
即:
| Xb2+Xb1-Xa2-Xa1 | <= Xa2-Xa1 + Xb2-Xb1
| Yb2+Yb1-Ya2-Ya1 | <=Y a2-Ya1 + Yb2-Yb1

(2) 对于这个问题,假设两个矩形相交,设相交之后的矩形为C,且矩形C的左上角坐标为(Xc1,Yc1),右下角坐标为(Xc2,Yc2),经过观察上图,很 显然可以得到:
Xc1 = max(Xa1,Xb1)
Yc1 = max(Ya1,Yb1)
Xc2 = min(Xa2,Xb2)
Yc2 = min(Ya2,Yb2)
这样就求出了矩形的相交区域。
另外,注意到在不假设矩形相交的前提下,定义(Xc1,Yc1),(Xc2,Yc2),且Xc1,Yc1,Xc2,Yc2的值由上面四个式子得出。这样, 可以依据Xc1,Yc1,Xc2,Yc2的值来判断矩形相交。
Xc1,Yc1,Xc2,Yc2只要同时满足下面两个式子,就可以说明两个矩形相交。
3) Xc1 <= Xc2
4) Yc1 <= Yc2
即:
max(Xa1,Xb1) <= min(Xa2,Xb2)
max(Ya1,Yb1) <= min(Ya2,Yb2)

时间: 2024-10-28 02:23:30

矩形相交以及求出相交的区域的原理解析_其它综合的相关文章

算法题。给出一推点的坐标,和入口点,结束点,求出最短路径

问题描述 打个比方,我要去北京,有好多景点,比如A,B,C,D,E,F,每个点都有坐标,1:假设从A开始,D结束,求出一个路线最短的方案.2:假设从A开始,结束点任意,求出一个路线最短的方案. 解决方案 解决方案二:动态规划~我猜是这个.解决方案三:这第一个问题和第二个问题有区别吗,简直一模一样两点间直线距离最短,做一个排序,哪个最短去那个解决方案四:假如说从交通大学出发,天坛公园结束,要走完每一个其他景点,求最短路径.这不是经典的最短路径的题,也不是图的遍历,反正我也不懂,求大神帮忙解决方案五

给定已知100个地址的经纬度 如何求出每个地址对应最近的三个地址?

问题描述 已知100个地址的经纬度:地址1地址2地址3...地址100根据经纬度求出地址1对应最近的三个地址? 解决方案 解决方案二:存到数据库里面..用SQL语句选择经纬度差值最小的3条记录即可.自己遍历计算也可以,就是麻烦解决方案三:求两点间的距离.再求个最值解决方案四:引用1楼xzhui的回复: 存到数据库里面..用SQL语句选择经纬度差值最小的3条记录即可.自己遍历计算也可以,就是麻烦 经纬度差值最小的这个是如何算呢?解决方案五:先把经纬度转换成投影坐标系再直接做加减运算解决方案六:引用

如何在wps表格中求出总分

  在wps表格中求出总分的方法: 写入数据,将鼠标定在总分下的单元格中,单元格必须是要定好位置,不然数值可能会有错误. 单击上方菜单栏中的求和按钮摆选择求和,选择求值区域, 只需要将第一行的求好,然后将鼠标移动到单元格的右下角,变成黑色十字架的形状,双击两下以下的数据便会自动求值. 求最大值是单击菜单栏上的求和按钮.选择最大值,同样的光标的位置要定在最大值右边单元格中,求好后将鼠标移动到单元格的右下角,变成黑色十字架的形状,向右拖拽数据便会自动求值. 求最小值也是单击菜单栏上的求和按钮.选择最

wps表格如何求出总分

  在wps表格中求出总分的方法: 写入数据,将鼠标定在总分下的单元格中,单元格必须是要定好位置,不然数值可能会有错误. 单击上方菜单栏中的求和按钮摆选择求和,选择求值区域, 只需要将第一行的求好,然后将鼠标移动到单元格的右下角,变成黑色十字架的形状,双击两下以下的数据便会自动求值. 求最大值是单击菜单栏上的求和按钮.选择最大值,同样的光标的位置要定在最大值右边单元格中,求好后将鼠标移动到单元格的右下角,变成黑色十字架的形状,向右拖拽数据便会自动求值. 求最小值也是单击菜单栏上的求和按钮.选择最

c++找出a b区域之间所有回文素数并输出

问题描述 c++找出a b区域之间所有回文素数并输出 编译错误,求大神帮看 #include #include using namespace std; int main() { int a,b,n; cin>>a>>b; for(n=a;n<=b;n++) { bool p(long m) { m=n; int s=0; while(m>0) { s=s*10+m%10; m=m/10; } if(s==n) return 1; else return 0; } if

求出e=1+1/1!+1/2!+1/3!+……+1/n!+……的近似值的java applet程序

程序 //求出e=1+1/1!+1/2!+1/3!+--+1/n!+--的近似值,要求误差小于0.0001import java.applet.*;import java.awt.*;import java.awt.event.*;public class AT1_1 extends Applet implements ActionListener{  TextField text1; Button Button1;  public void init() {  text1 = new Text

javascript实现给定半径求出圆的面积

  这篇文章主要介绍了javascript实现给定半径求出圆的面积的相关资料,需要的朋友可以参考下 代码相当简单,这里就不多废话了,小伙伴们自己参考下吧. ? 1 2 3 4 5 6 <script> var circularityArea = new Function("r","return r*r*Math.PI"); //创建一个函数对象 var rCircle = 2;//给定圆的半径 var area = circularityArea(rCi

Excel2003中怎么使用Address求出指定单元格的位置

  Excel2003中怎么使用Address求出指定单元格的位置           ①我们打开Excl2003,新建一张工作表,包含地区.城市.抽奖名单等等信息.看到苏浩这名员工幸运中奖,为了让大家看的清楚,我已经在原表格中红色显示了,我们要通过函数得知其所在的单元格位置,在F2单元格输入: =ADDRESS(1+MATCH(E2,C2:C10,0),COLUMN(C1)) .     ②回车按下,得到结果是$C$8,意思是该中奖人员在C8单元格. ③修改中奖人员名字,对应的结果也发生变化,

使用matlab画出椭圆图形以及求出方程

问题描述 使用matlab画出椭圆图形以及求出方程 已知椭圆上的x,y的坐标矩阵为:x=[0.8812 1.1455 0.6326 0.9475 1.1465 0.4881 1.0438 0.7772 1.1447 0.6305 1.0738 1.1595 1.1875 0.5363]; y=[0.9217 0.8375 -0.256 0.2837 0.8414 -0.1691 1.1582 0.7222 0.8345 0.3755 1.1881 0.8943 1.1674 0.0829]; 使