资讯详情

OOP 判断矩形是否重叠(复合类+友元)

用CPoint表示点,用两个CPoint对象表示矩形类CRect两点对角线。分别实现CPoint类和CRect类,主函数用输入坐标定义4个CPoint每2个类对象CPoint再构造一个对象CRect对象,然后写一个友元函数,判断两个矩形是否重叠。

判断次数

矩形1对角线顶点坐标x1, y1, x2, y2

矩形2对角线顶点坐标x1, y1, x2, y2

...

是否重叠

样品查看模式

检查格式正常显示

3 1529 1324 5678 5777 2510 9429

notoverlapped overlapped overlapped

/******************************************************************************************/

这个问题的困难在于如何判断矩阵是否重叠,已知两个矩阵的两个分别的顶点,但无法判断哪个顶点的位置关系和两个矩阵的位置关系。

因此,需要一种可以忽略上述不确定性的算法来实现判断。

(1)如果已知矩阵的两个顶点,可以直接得到矩阵的中心点P(Fx1, Fy1)、Q(Fx2 , Fy2);

(2) x间距和y间距可以通过两个中心点计算,记录为Dx , Dy ;

(3)利用fabs函数(取绝对值)在x轴方向和y轴方向点P到矩阵1之间获得距离Dx1和Dy1.点Q到矩阵2的距离Dx2和Dy2 ,如图所示;

(4)可以根据Dx与Dx1 Dx2 与Dy和Dy1 Dy2 判断两个矩阵是否重叠;

当Dx <= Dx1 Dx2 与Dy <= Dy1 Dy2 两个矩阵同时重叠,否则不重叠;

基于上述算法的代码如下:

#include <iostream> #include <math.h> using namespace std;  class CPoint    //单个点的类 {  public:   int x ;   int y ;    public:   CPoint(int x0 , int y0)    {    x = x0 ;    y = y0 ;   }  };  class CRect    ///单个矩阵类 {  CPoint p1 ;  CPoint p2 ;    public:   CRect(int x1 , int y1 , int x2 , int y2):p1(x1 , y1) , p2(x2 , y2)   {       }      friend bool overlap(CRect &cr1 , CRect &cr2) ;  ///友元函数判断矩阵是否重叠 ;    };  bool overlap(CRect &cr1 , CRect &cr2)    实现///算法 {  float Fx1 , Fy1 ;  float Fx2 , Fy2 ;  Fx1 = (cr1.p1.x   cr1.p2.x )/2.0 ;       //注意这里 除的是2.0保证Fx、Fy为浮点数;  Fy1 = (cr1.p1.y   cr1.p2.y )/2.0 ;    Fx2 = (cr2.p1.x   cr2.p2.x )/2.0 ;  Fy2 = (cr2.p1.y   cr2.p2.y )/2.0 ;    float Dx1 = fabs(Fx1 - cr1.p1.x) ;    //abs函数返回int ; fabs函数返回float ;  float Dy1 = fabs(Fy1 - cr1.p1.y) ;  float Dx2 = fabs(Fx2 - cr2.p1.x) ;  float Dy2 = fabs(Fy2 - cr2.p1.y) ;    float Dx = fabs(Fx1 - Fx2) ;  float Dy = fabs(Fy1 - Fy2) ;    if(Dx <= Dx1   Dx2 && Dy <= Dy1   Dy2)   return true ;  return false ; }  int main() {  int t ;  cin >> t ;  while(t--)  {   int x1 , y1 , x2 , y2 ;   cin >> x1 >> y1 >> x2 >> y2 ;   CRect a1(x1, y1 , x2 , y2 ) ;      cin >> x1 >> y1 >> x2 >> y2 ;   CRect a2(x1, y1 , x2 , y2 ) ;         //获取两个矩阵 输入 ;     if(overlap(a1 , a2))   {    cout << "overlapped" << endl ;   }   else   {    cout << "not overlapped" << endl ;    &nbp;      //输出结果 ; 
        }
            
    }
}

标签: dx1台中仪表变送器dx1通化仪表变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台