题目
分析
题目是要求检测互相之间有碰撞的矩形的个数,怎么确定两个矩形之间是否有碰撞呢?
我的思路如下,任给定两个矩形,根据其左上角坐标和右下角坐标,计算出其中心坐标(x0, y0),
其宽度 Width = | x1 - x2 |,其高度 Height = | y1 - y2 |,如果:
两矩形中心坐标X的差值小于 等于它们宽度之和的一半, 且 两矩形中心坐标的Y的差值小于等于它们高度之和的一半, 那么则判定两矩形相交。
怎么统计出所有的相交个数呢?我使用了很直接的思路,两两矩形逐个检测。
没有去想太好的办法,如果有更好的解决办法,希望各位积极指教!
代码如下:
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
class Point
{
public:
Point() { }
Point(float _x, float _y)
: x(_x), y(_y) { }
float x, y;
};
struct Rect
{
Rect(float x1, float y1, float x2, float y2)
: Width( std::abs(x2 - x1) )
, Height( std::abs(y2 - y1) )
, TopLeft( Point(x1, y1) )
, RightBottom( Point(x2, y2) )
, Center( Point( (x1 + x2) / 2, (y1 + y2) / 2 ) )
{ }
float Width, Height;
Point TopLeft, RightBottom, Center;
};
// 碰撞检测
int CollisionDection(const std::vector<Rect>& rects)
{
std::size_t Size = rects.size();
int Counter = 0;
for (int i = 0; i < Size - 1; ++i) {
for (int j = i + 1; j < Size; ++j) {
Rect r1 = rects.at(i);
Rect r2 = rects.at(j);
if (std::abs(r1.Center.x - r2.Center.x) <= (r1.Width + r2.Width) / 2
&& std::abs(r1.Center.y - r2.Center.y) <= (r1.Height + r2.Height) / 2)
Counter++;
}
}
return Counter;
}
int main(void)
{
int t;
std::cin >> t;
while(t--)
{
int n;
std::cin >> n;
std::vector<Rect> Rects;
while (n--)
{
float x1, x2, y1, y2;
std::cin >> x1 >> y1 >> x2 >> y2;
Rects.push_back(Rect(x1, y1, x2, y2));
}
std::cout << CollisionDection(Rects) << std::endl;
}
}