zoukankan      html  css  js  c++  java
  • 计算几何判断平行坐标轴的2矩形是否有交集

    2D平面内 如果有2个边分别平行于直接坐标轴的矩形a,b. 如果判断a,b是否有公共面积?

    下面简单介绍2个方法

    1.队友告诉的方法 可以很方便的计算出2矩形相交面积的大小

    分别找到2个矩形右下角的坐标中最小的x(minx)和最小的y(miny)

    在找到2个矩形左上角坐标中最大的x(maxx)和最大的y(maxy)

    最后 相交的矩形即对角线[minx,miny]--[maxx,maxy]所构成的矩形 当然如果minx>maxx或miny>maxy矩形不相交

    2.我以前使用的方法 根据两个矩形的中心相对位置来判断是否有交集

    设2个矩形a,b的中心分别为oa ob(这个很容易求出) 通过作图很容易发现 如果2个矩形要有交集必须满足2个条件

    oa ob横坐标距离<两矩形横边和/2   oaob纵坐标距离<两矩形纵边和/2 这个看上图很明显

    所有有了以下函数 这2个方法都是O(1)时间内完成的

    x1,y1--x2,y2            x3,y3--x4,y4 分别是2个矩形的对角线顶点坐标

    方法一:

    /*****************
    Author:夏天的风
    Function:To determine whether 2 paralleled rectangle share common area
    ****
          if(x1>x2) swap(x1,x2);
          if(y1>y2) swap(y1,y2);
          if(x3>x4) swap(x3,x4);
          if(y3>y4) swap(y3,y4);
          lx=max(x1,x3); ly=max(y1,y3);
          rx=min(x2,x4); ry=min(y2,y4);
          if(lx>rx||ly>ry) puts("0.00");
          else printf("%.2f\n",(rx-lx)*(ry-ly));
    

      

    方法二:(整点,可以改写为浮点数)

    /************************
    Author: lxglbk
    Function: To determine whether 2 paralleled rectangle share common area
    ********
    bool Cross_Rect(const Rect & a,const Rect & b)
    {
    	return ( abs((a.x1+a.x2)-(b.x1+b.x2))<(a.x2-a.x1+b.x2-b.x1)
    		&& abs((a.y1+a.y2)-(b.y1+b.y2))<(a.y2-a.y1+b.y2-b.y1) );
    }
    

      

  • 相关阅读:
    10.矩形覆盖 Java
    09.变态跳台阶 Java
    08.青蛙跳台阶 Java
    07.斐波那契数列 Java
    06.旋转数组的最小数字 Java
    05.用两个栈实现队列 Java
    04.重建二叉树 (Java)
    03.从尾到头打印链表 (Java)
    数据结构-有序链表的合并
    数据结构-判断链表是否存在环形链表
  • 原文地址:https://www.cnblogs.com/lxglbk/p/2644910.html
Copyright © 2011-2022 走看看