矩形重叠面积

求两个矩形的重叠面积

问题描述

求解两个矩形的重叠面积

原理

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;

}

例子求解答案
在这里插入图片描述

### C++ 计算两个矩形重叠面积 对于两个矩形之间重叠面积的计算,可以通过分析矩形的位置关系并利用几何方法得出结果。当考虑的是边平行于坐标轴的情况时,逻辑相对简单。 #### 判断是否有重叠区域 为了确定是否存在重叠部分,需要检查一个矩形的最大X/Y值是否小于另一个矩形最小X/Y值;如果存在这样的情况,则说明这两个矩形不相交[^1]。 ```cpp bool isOverlap(int A, int B, int C, int D, int E, int F, int G, int H){ // (A,B) 和 (E,F) 是左上角; (C,D) 和 (G,H) 是右下角. if(C <= E || G <= A || D <= F || H <= B) return false; else return true; } ``` #### 计算实际重叠面积 一旦确认了两矩形确实发生了交叉,那么就可以通过下面的方法来获取它们共同覆盖的空间大小: - 找到重叠区间的宽度:`min(右边界的最大值)-max(左边界的最小值)` - 同样地找到高度:`min(顶部边界的最大值)-max(底部边界的最小值)` - 将上述两者相乘即得到最终的结果[^3] ```cpp int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) { bool overlap = isOverlap(A, B, C, D, E, F, G, H); if (!overlap) return 0; int width_overlap = min(C,G) - max(A,E); int height_overlap = min(D,H) - max(B,F); return width_overlap * height_overlap; } ``` 此段代码实现了基本的功能需求,但对于更复杂的场景比如倾斜角度不同的矩形则需采用其他策略如变换至标准位置再做判断等操作[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值