一、题目
一个经纬度范围。经度 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我就不说了,非常简单,自己看。