用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; //输出结果 ;
}
}
}