卫星系统算法课程设计 - 第4部分 区域覆盖率

一、题目

一个经纬度范围。经度 75°E-135°E,纬度范围 0°N-55,计算这个区域在某时段内的覆盖率。

二、网格划分

  我们使用老师提供的网格划分方法,讲此区域划分为一块一块的方格。

  而我这里划分的网格边长为2.5,刚好是24×22的矩阵。

三、完成上一篇的代码

上次复制mainwindow时,你们应该有发现,少了什么square.h&cpp,这里将补充。

square目的是保存上述划分的网格!

square.h:

#ifndef SQUARE_H
#define SQUARE_H

#include<QVector>

//方格类
class Square
{
public:
    double x,y;//方格的坐标,在qt中是使用左上角作为坐标,
    double longitude;//城市的经度
    double latitude;//城市的纬度
    //方格的长度
    double length;
    bool isCover;
    //真实宽度
    double realSize;
    int state;//方格的状态,被卫星覆盖:1,不被覆盖:0,待判断:2
    //对于待判断的格子,将该格子四分化,存入数组中。我们使用一个vector进行此操作
    //QVector<Square> tree;
    Square();
    Square(double _x, double _y, double log, double lat, double realSize, double length, int _state);
    Square(const Square &square);
    Square &operator=(Square &square)
    {
        x = square.x;
        y = square.y;
        longitude = square.longitude;
        latitude = square.latitude;
        length = square.length;
        realSize = square.realSize;
        state = square.state;
        isCover = false;
        return *this;
    }
};
/*
//将地图信息存好
class myMap
{
public:
    Square map1[30][30];//存储经度75 - 135  ,纬度0 - 60
    myMap()
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                //y对应纬度,x对应经度
                map1[i][j].y = 180 + 24 * i;
                map1[i][j].x = 24 + 24 * j;
                map1[i][j].latitude = 2*i;
                map1[i][j].longitude = 75 + 2*j;
                map1[i][j].state = 0;
                map1[i][j].length = 24;
            }
        }
    }

};
*/

#endif // SQUARE_H

square.cpp:

#include "square.h"

Square::Square()
{
    x = 0;
    y = 0;
    longitude = 0;
    latitude = 0;
     realSize = 0;
    length = 0;
    state = 0;
    isCover =false;
}

Square::Square(const Square &square)
{
    x = square.x;
    y = square.y;
    longitude = square.longitude;
    latitude = square.latitude;
    length = square.length;
    realSize = square.realSize;
    state = square.state;
    isCover =false;
}

Square::Square(double _x, double _y, double log, double lat, double real, double _length, int _state)
{
    x = _x;
    y = _y;
    longitude = log;
    latitude = lat;
    //真实宽度
    realSize = real;//真实长度
    length = _length;
    state = _state;
    isCover =false;
}



x,y是网格在qt坐标的左上方位置

longitude,latitude不用解释吧,经度与纬度

length是网格在qt坐标下的边长,realSize真实的网格边长,比如我们分的2.5°边长的网格,你tm在qt中画2.5边长的方格你tnn的能看得清楚吗?才2.5个像素点!!!这点根本不想解释。

四、覆盖率问题

上次的mainwindow.cpp里有,可以去看看

on_pushButton_3_clicked()函数

还有绘图事件函数。我这里稍微讲一点,请跟着代码看。

我们输入开始时间与结束时间,就可以进行仿真,先把变量声明好,temp1-4是用于保存网格4个点与卫星中心的距离的平方,用于判断该点是否在卫星服务内。

进行循环嵌套,遍历时间、遍历网格矩阵、遍历卫星

integral函数是计算网格面积的,用的是微积分。

 遍历中,我们就是要判断是否4个点与卫星的位置,如果4个点都不在卫星内,number++,标记不被覆盖数+1,进行下一卫星循环。若卫星已经遍历完且number小于9,哈哈哈,还要我说么?

就tm说明这个方格存在被某个或某几个卫星覆盖,但没有完全覆盖,说明这个方格应该继续细分判断。

 细分,然后压入栈中。

遍历全部完后,我们能得到的是:st(里面包含了所有被继续细分的方格)、state被标记为1的方格,还有cul把这个state为1(就是4个点都在卫星内)的方格面积进行累加了。

那么要做的是,继续细分st里的方格,对于st里的方格,肯定也是有一些是全被覆盖,有部分覆盖,有都不被覆盖,经典的while栈不为空,接着遍历呗。然后自己设置能遍历的最小方格就行了啊。

对于最小的方格(自己看代码,我已经设置realSize最小限制)

如果此最小方格全覆盖,state标记为1,cul累加面积,然后加入等待绘图序列waitDraw中。标记为1的方格都会被画红色

对于部分覆盖,state标记为2,加入waitDraw中,将被画成蓝色

cul就是这一秒的覆盖面积,acuCover是累计覆盖面积,自己看。画图QChart我就不说了,非常简单,自己看。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值