求两个矩形的重叠面积
问题描述
求解两个矩形的重叠面积
原理
TODO…
code
#include <bits/stdc++.h>
// 求解矩形相交的区间
// 1、矩形的描述: 矩形中间点, 宽一半 行一半
using namespace std;
// 定义更加普遍的rect类
template<typename scale>
class rect{
public:
scale mMX = 0.;
scale mMY = 0.;
scale mhalfW = 0.;
scale mhalfH = 0.;
rect(scale _mMX, scale _mMy, scale _mhalfW, scale _mhalfH):
mMX(_mMX), mMY(_mMy), mhalfW(_mhalfW), mhalfH(_mhalfH){
// cout << mMX << " " << mMY << " " << mhalfH << " " << mhalfW << endl;
}
~rect(){}
vector<pair<scale, scale>> getPoints() const {
auto TopLeft = make_pair(mMX-mhalfH, mMY-mhalfW);
auto TopRight = make_pair(mMX-mhalfH, mMY+mhalfW);
auto BottomLeft = make_pair(mMX+mhalfH, mMY-mhalfW);
auto BottomRight = make_pair(mMX+mhalfH, mMY+mhalfW);
vector<pair<scale, scale>> res = {TopLeft, TopRight, BottomLeft, BottomRight};
return res;
}
bool isInRect(const pair<scale, scale> & in){
if(abs(mMX - in.first) >= mhalfH) return false;
if(abs(mMY - in.second) >= mhalfW) return false;
return true;
}
// 求取重叠区域
scale getIntArea(const rect<scale> & other){
// 判断有没有交集
if((abs(mMX - other.mMX) < mhalfH+other.mhalfH) && (abs(mMY - other.mMY) < mhalfW+other.mhalfW)){ // 存在交集计算
vector<pair<scale, scale>> points = other.getPoints(); // 拿到四个点
// debug 四个点
// for(auto po : points){
// cout << "p (" << po.first << "," << po.second << ")" << endl;
// }
scale down = min(mMX + mhalfH, points[2].first);
scale top = max(mMX - mhalfH, points[0].first);
scale left = max(mMY-mhalfW, points[0].second);
scale right = min(mMY+mhalfW, points[1].second);
return (right - left)*(down - top);
}
return scale(0);// 没有交集
}
};
int main(int * argc, char ** argv){
rect<double> r1(0. ,0. , 0.5, 0.5);
rect<double> r2(1. ,1. , 1., 1.);
double andVal = r1.getIntArea(r2);
cout << "r1 & r2 = " << andVal << endl;
return 0;
}
例子求解答案