当前位置:   article > 正文

卫星系统算法课程设计 - 第一部分:城市时间窗口、间隙等_卫星对地时间窗口

卫星对地时间窗口

  先看我上传的视频,看看是否是你们想要的效果:

【算法课设】 卫星系统 运行情况存档_哔哩哔哩_bilibili

【算法课设】存档2_哔哩哔哩_bilibili

注意:视频中没有画出地球那种越靠极点纬度线越短的情况,但面积计算是没有问题的,因为画图和计算分离,图只是可视化,但面积等数据用的是微积分。

1、问题背景

  当前,卫星移动通信、气象预报、遥感探测、军事侦察、资源勘探、灾害监
测、导航定位等多个领域发挥着越来越重要的作用。而且,在一般的航天任务应
用中,我们往往需要使用一群卫星共同来完成任务。将一群卫星的集合,称作卫
星星座。
  在每个时刻,卫星的服务范围可以近似成一个圆锥形的区域。该锥形区域在
地面上的投影为球面圆形的(注:球面圆,不是平面圆)。如果该时刻,地面目标
在该圆形区域内,则卫星可以对该地面目标提供服务,称作“地面目标在该时刻
被卫星覆盖”。

2、第一个问题----计算卫星与目标的时间窗口

  卫星对一个地面目标的时间窗口,是指在仿真时间内,卫星对目标可以提供
服务的时间段的集合。时间窗口可以表示为一个时间区间,在该区间内卫星能够
对目标提供服务,而不在该时间区间内,卫星不能对目标提供服务。
卫星星座对一个地面目标的时间窗口,为星座中每颗卫星对目标时间窗口的
并集。
完成如下计算:
(1) 对以下每个目标,计算星座对其时间窗口。同时,统计时间窗口的最
大值、最小值与累积值。对每个目标,计算其时间间隙,并统计时间间隙的最大
值与累积值。
目标的数据如下:

 

(2) 在经度 75°E-135°E,纬度范围 0°N-55°N 的区域范围内,计算每
个坐标的时间间隙的最大值、时间间隙的和,以及时间间隙平方和三个指标,并 将结果分别以可视化形式展示出来,经纬度的离散化精度可调节,最小需要考虑
到 0.1°。
2.1、问题一分析
  据我所知,每年的数据是不一样的,如果有人在做此课设,写代码时需要注意自己写的城市个数与每个城市的名称地点位置。
2.1.1、数据预处理
  老师给我们的数据包含了9个卫星在一天之内每一秒的位置信息,这些点也就组成了该卫星服务的“圆”(看作是平面圆,之后说到的矩形也是如此,但计算面积是要用微积分)区域。
  那么我们可以想到,有城市位置,有9个圆的位置,那是不是把这个城市与某秒9个圆的位置进行计算,看看是否在圆内,如果9个圆都不覆盖此城市,那说明该秒时这个城市不被服务。
  但这里遇到一个问题:每一秒每个卫星都有21个点(没记错的话),那数据量是不是有点太大了。所以我们拿到题目不要上来就刷刷写代码,没什么luan用,先分析问题。
  那么我们可以想到,能不能找两个点,这两个点正好是该秒时21个点的最高点与最低点,这样就可以得到圆直径,然后两个点的中点就是圆心。
  但我发现以前的学长用的就是这个方法,你们应该可以找得到。那么我们要有所创新,不要和别人一样,而且,只要两个点其实误差会稍大(虽然估计大不了千分之一)。那么我将给出新的方法
* 数据预处理---取圆上3个点通过克莱姆法则求解半径与圆心 
   我们在选取最高点和最低点的情况下,再选取一点,你们看那个学长的文章应该能知道最高和最低点,然后我们在要最左边点或最右边点,自己去看一下是第几个点。 然后看下图
  

 (本图取自本人的汇报ppt,希望对你们有帮助)

接下里将放出数据预处理代码,这些代码是使用c++写的,请自己用c++开一个空项目,将下列代码放入cpp中,把老师给的卫星数据放入项目文件,运行就能得到结果。目的是将卫星信息简化,将每个卫星每一秒的中心位置或者说圆心位置写入文件中。那么文件应该包含86400个经度纬度信息。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<fstream>
  4. #include <stdio.h>
  5. #include<stdlib.h>
  6. #include<string>
  7. #include<vector>
  8. #include <typeinfo>//typeid
  9. using namespace std;
  10. double Radius[86400];//用于临时保存每一秒对应的半径
  11. double test1[10];
  12. double aveRadius[9];
  13. double pingJun(double* radius)
  14. {
  15. double cul = 0;
  16. for (int i = 0; i < 86400; i++)
  17. {
  18. cul += radius[i];
  19. }
  20. //f
  21. return (cul / (double)86400);
  22. }
  23. double HangLieShi(double a11, double a12, double a21, double a22)
  24. {
  25. return (a11 * a22 - a12 * a21);
  26. }
  27. class myPoint
  28. {
  29. public:
  30. myPoint()
  31. {
  32. x = 0, y = 0;
  33. }
  34. myPoint(double x0, double y0) { x = x0; y = y0; }
  35. myPoint(myPoint& P) { x = P.x; y = P.y; }
  36. myPoint& operator=(const myPoint& P)
  37. {
  38. x = P.x;
  39. y = P.y;
  40. return *this;
  41. }
  42. ~myPoint() {}
  43. void set(double x0, double y0)
  44. {
  45. x = x0;
  46. y = y0;
  47. }
  48. double x, y;
  49. };
  50. myPoint Position[9][86400];//第i个卫星的第j秒的圆心
  51. class Line
  52. {
  53. public:
  54. Line(myPoint a0, myPoint b0) :a(a0), b(b0)
  55. {
  56. if (a.x == b.x)
  57. {
  58. A = 0;
  59. B = 1;
  60. C = (a.y + b.y) / 2;
  61. }
  62. else if (a.y == b.y)
  63. {
  64. A = 1;
  65. B = 0;
  66. C = (a.x + b.x) / 2;
  67. }
  68. else
  69. {
  70. A = 1;
  71. B = (a.x - b.x) / (a.y - b.y);
  72. C = (a.x + b.x) / 2 + B * (a.y + b.y) / 2;
  73. }
  74. }
  75. ~Line() {}
  76. myPoint a, b;
  77. double A, B, C;
  78. };
  79. class Circle
  80. {
  81. public:
  82. Circle()
  83. {
  84. }
  85. Circle(myPoint a0, myPoint b0, myPoint c0) :a1(a0), b1(b0), c1(c0) {}
  86. ~Circle() {}
  87. double calculation(int number, int time);//计算圆心,半径
  88. void reSet(myPoint&a0, myPoint&b0, myPoint&c0)
  89. {
  90. a1 = a0; b1 = b0; c1 = c0;
  91. }
  92. protected:
  93. myPoint a1, b1, c1;
  94. double x0, y0, R;
  95. };
  96. //number对应卫星编号,time即时刻,要将每个卫星每时刻对应的圆心坐标进行保存
  97. double Circle::calculation(int number, int time)
  98. {
  99. Line l1(a1, b1), l2(a1, c1);
  100. double J;
  101. J = HangLieShi(l1.A, l2.A, l1.B, l2.B);
  102. //简单来说呢,就是克莱姆法则求解方程
  103. //如果两个直线不同,说明可以使用克莱姆法则求解
  104. if (J)
  105. {
  106. //将向量的常量代替矩阵对应的值,求出圆心
  107. x0 = HangLieShi(l1.C, l2.C, l1.B, l2.B) / J;
  108. y0 = HangLieShi(l1.A, l2.A, l1.C, l2.C) / J;
  109. Position[number][time].set(x0, y0);
  110. //使用圆方程解半径
  111. R = sqrt((a1.x - x0) * (a1.x - x0) + (a1.y - y0) * (a1.y - y0));
  112. }
  113. else
  114. {
  115. return -1;
  116. }
  117. return R;
  118. }
  119. //读文件函数
  120. void Read(int number, double &radius)
  121. {
  122. ifstream ifs;//流对象
  123. //读文件0-8
  124. if (0 <= number && 9 > number)
  125. {
  126. switch (number)
  127. {
  128. case 0:
  129. {
  130. ifs.open("SatCoverInfo_0.txt");
  131. break;
  132. }
  133. case 1:
  134. {
  135. ifs.open("SatCoverInfo_1.txt");
  136. break;
  137. }
  138. case 2:
  139. {
  140. ifs.open("SatCoverInfo_2.txt");
  141. break;
  142. }
  143. case 3:
  144. {
  145. ifs.open("SatCoverInfo_3.txt");
  146. break;
  147. }
  148. case 4:
  149. {
  150. ifs.open("SatCoverInfo_4.txt");
  151. break;
  152. }
  153. case 5:
  154. {
  155. ifs.open("SatCoverInfo_5.txt");
  156. break;
  157. }
  158. case 6:
  159. {
  160. ifs.open("SatCoverInfo_6.txt");
  161. break;
  162. }
  163. case 7:
  164. {
  165. ifs.open("SatCoverInfo_7.txt");
  166. break;
  167. }
  168. case 8:
  169. {
  170. ifs.open("SatCoverInfo_8.txt");
  171. break;
  172. }
  173. default:
  174. {
  175. return;
  176. }
  177. }
  178. }
  179. else
  180. {
  181. return;
  182. }
  183. //ifs.open("SatCoverInfo_0.txt");
  184. if (!ifs)
  185. {
  186. cout << "读取失败" << endl;
  187. return ;
  188. }
  189. //打开指定文件
  190. int getLineNum = 22;//每次读取22行
  191. double x = 0, y = 0;
  192. char name[20];
  193. myPoint a, b, c;
  194. Circle A;
  195. //读文件。
  196. for (int j = 0; j < 86400; j++)
  197. {
  198. for (int i = 0; i < getLineNum; i++)
  199. {
  200. if (i == 0)
  201. {
  202. ifs.getline(name, 20);
  203. continue;
  204. }
  205. ifs >> x >> y;
  206. if (i == 1)
  207. {
  208. a.set(x, y);
  209. }
  210. else if (i == 6)
  211. {
  212. b.set(x, y);
  213. }
  214. else if (i == 11)
  215. {
  216. c.set(x, y);
  217. }
  218. else if (i == 21)
  219. {
  220. ifs.getline(name, 20);
  221. }
  222. }
  223. A.reSet(a, b, c);
  224. Radius[j] = A.calculation(number, j);
  225. }
  226. ifs.close();
  227. radius = pingJun(Radius);
  228. }
  229. void Write(int number)
  230. {
  231. ofstream ofs;//流对象
  232. //读文件0-8
  233. if (0 <= number && 9 > number)
  234. {
  235. switch (number)
  236. {
  237. case 0:
  238. {
  239. ofs.open("Position_0.txt");
  240. break;
  241. }
  242. case 1:
  243. {
  244. ofs.open("Position_1.txt");
  245. break;
  246. }
  247. case 2:
  248. {
  249. ofs.open("Position_2.txt");
  250. break;
  251. }
  252. case 3:
  253. {
  254. ofs.open("Position_3.txt");
  255. break;
  256. }
  257. case 4:
  258. {
  259. ofs.open("Position_4.txt");
  260. break;
  261. }
  262. case 5:
  263. {
  264. ofs.open("Position_5.txt");
  265. break;
  266. }
  267. case 6:
  268. {
  269. ofs.open("Position_6.txt");
  270. break;
  271. }
  272. case 7:
  273. {
  274. ofs.open("Position_7.txt");
  275. break;
  276. }
  277. case 8:
  278. {
  279. ofs.open("Position_8.txt");
  280. break;
  281. }
  282. default:
  283. {
  284. return;
  285. }
  286. }
  287. }
  288. else
  289. {
  290. return;
  291. }
  292. //是否打开成功
  293. if (!ofs)
  294. {
  295. cout << "读取失败" << endl;
  296. return;
  297. }
  298. for (int j = 0; j < 86400; j++)
  299. {
  300. ofs << Position[number][j].x << " " << Position[number][j].y<<endl;
  301. }
  302. }
  303. int main()
  304. {
  305. for (int i = 0; i < 9; i++)
  306. {
  307. Read(i, aveRadius[i]);
  308. Write(i);
  309. }
  310. for (int i = 0; i < 9; i++)
  311. {
  312. cout << "第" << i<< "个卫星区域平均半径为:" << aveRadius[i] << endl;
  313. }
  314. //一下的注释代码是最开始使用来求平均半径的
  315. //Read(3, aveRadius[3]);
  316. //Write(3);
  317. //cout << "平均半径为:" << aveRadius[3] << endl;
  318. return 0;
  319. }

  那么以上,我们就可以把第0到第8个卫星的位置信息写入文件中,第0个卫星的文件是Position_0,第1是Position_1,后面同理。

  然后这里我直接给出9个卫星的平均半径,之后在qt中直接用这个半径作为每个卫星的半径就可以了。卫星服务区的半径是:7.0068

2.2、求城市时间窗口与时间间隙

  时间窗口,比如0 - 86399秒内,第1秒-第400秒该城市被卫星服务(只要被9个卫星的其中一个服务就是被服务),那么产生一个时间窗口[1,400],那么第0秒和第401秒是不被服务的。

  我下面再讲的仔细些,包含代码,先写城市City类,成员变量有:城市名称、经度、纬度、时间窗口的QVector。然后写一个时间窗口TimeSlot类,成员变量:startTime、overTime、length。

[startTime,overTime],length = overTime - startTime + 1。

然后卫星的类Satellite,成员变量:double *x,double *y。

qt的代码如下:

city.h

  1. #ifndef CITY_H
  2. #define CITY_H
  3. #include"timeslot.h"
  4. #include<QVector>
  5. //这是一个城市的类
  6. class City
  7. {
  8. public:
  9. double longitude;//城市的经度
  10. double latitude;//城市的纬度
  11. QString name;//城市的名字
  12. QVector<TimeSlot> slot;//该城市的时间窗口,后面会计算,出现一个窗口时候就会push进去一个窗口
  13. public:
  14. City();
  15. };
  16. //保存城市的表
  17. class CityList
  18. {
  19. public:
  20. City city[19];//一共有19个城市
  21. //构造函数
  22. CityList();
  23. int location(QString n);//传入名字,定位
  24. };
  25. #endif // CITY_H

city.cpp

  1. #include "city.h"
  2. City::City()
  3. {
  4. this->longitude = 0;
  5. this->latitude = 0;
  6. name = "";
  7. }
  8. CityList::CityList()
  9. {
  10. city[0].name = "奥克兰";
  11. city[0].longitude = 237.87;//-122.13
  12. city[0].latitude = 37.47;
  13. //
  14. city[1].name = "敖德萨";
  15. city[1].longitude = 30.46;
  16. city[1].latitude = 46.3;
  17. //
  18. city[2].name = "冈山";
  19. city[2].longitude = 133.54;
  20. city[2].latitude = 34.4;
  21. //
  22. city[3].name = "俄克拉荷马城";
  23. city[3].longitude = 262.68;//-97.32
  24. city[3].latitude = 35.29;
  25. //
  26. city[4].name = "鄂木斯克";
  27. city[4].longitude = 55;
  28. city[4].latitude = 73.22;
  29. //
  30. city[5].name = "奥拉涅斯塔克";
  31. city[5].longitude = 290.42;//69.58
  32. city[5].latitude = 12.3;
  33. //
  34. city[6].name = "奥拉多";
  35. city[6].longitude = 278.78;//-81.22
  36. city[6].latitude = 28.3;
  37. //
  38. city[7].name = "大阪";
  39. city[7].longitude = 135.3;
  40. city[7].latitude = 34.4;
  41. //
  42. city[8].name = "奥斯陆";
  43. city[8].longitude = 10.41;
  44. city[5].latitude = 159.56;
  45. //
  46. city[9].name = "渥太华";
  47. city[9].longitude = 284.57;//-75.43
  48. city[9].latitude = 45.25;
  49. //
  50. city[10].name = "瓦拉杜古";
  51. city[10].longitude = 358.6;//-1.4
  52. city[10].latitude = 12.2;
  53. //
  54. city[11].name = "帕果帕果";
  55. city[11].longitude = 189.58;//-170.42
  56. city[11].latitude = -14.16;
  57. //
  58. city[12].name = "巨港";
  59. city[12].longitude = 104.5;
  60. city[12].latitude = -2.59;
  61. //
  62. city[13].name = "波赫恩";
  63. city[13].longitude = 158.1;
  64. city[13].latitude = 6.55;
  65. //
  66. city[14].name = "帕尔马";
  67. city[14].longitude = 2.39;
  68. city[14].latitude = 39.26;
  69. //
  70. city[15].name = "巴拿马";
  71. city[15].longitude = 280.7;//-79.3
  72. city[15].latitude = 8.57;
  73. //
  74. city[16].name = "帕皮提";
  75. city[16].longitude = 210.66;//
  76. city[16].latitude = -17.32;
  77. //
  78. city[17].name = "帕拉马里博";
  79. city[17].longitude = 304.86;//55.14
  80. city[17].latitude = 5.52;
  81. //
  82. city[18].name = "巴黎";
  83. city[18].longitude = 2.2;
  84. city[18].latitude = 48.51;
  85. }
  86. int CityList::location(QString n)
  87. {
  88. for(int i = 0; i < 19; i++)
  89. {
  90. if(city[i].name == n)
  91. {
  92. return i;
  93. }
  94. }
  95. return -1;
  96. }

timeslot.h

  1. #ifndef TIMESLOT_H
  2. #define TIMESLOT_H
  3. //如题,这是一个时间段的类,用于保存各城市各时间窗口的值(开始时间、结束时间、时间长度)
  4. class TimeSlot
  5. {
  6. public:
  7. int startTime;
  8. int overTime;
  9. int length;
  10. public:
  11. TimeSlot();
  12. TimeSlot(int s, int o);
  13. void set(int start, int over);
  14. };
  15. //时间间隙
  16. class TimeGap
  17. {
  18. };
  19. #endif // TIMESLOT_H

timeslot.cpp

  1. #include "timeslot.h"
  2. TimeSlot::TimeSlot()
  3. {
  4. startTime = 0;
  5. overTime = 0;
  6. length = 0;
  7. }
  8. TimeSlot::TimeSlot(int s, int o)
  9. {
  10. startTime = s;
  11. overTime = o;
  12. length = overTime - startTime + 1;
  13. }
  14. void TimeSlot::set(int start, int over)
  15. {
  16. startTime = start;
  17. overTime = over;
  18. //[1, 5]的长度是 5 - 1 + 1
  19. //对于区间[l, r],长度为 r - l + 1
  20. length = overTime - startTime + 1;
  21. }

satellite.h

  1. #ifndef SATELLITE_H
  2. #define SATELLITE_H
  3. //卫星的类,保存半径与中心坐标,但由分析情况来看,半径已经不需要了
  4. class Satellite
  5. {
  6. public:
  7. double *x;
  8. double *y;
  9. public:
  10. Satellite();
  11. ~Satellite();
  12. };
  13. #endif // SATELLITE_H

satellite.cpp

  1. #include "satellite.h"
  2. Satellite::Satellite()
  3. {
  4. x = new double[86400];
  5. y = new double[86400];
  6. }
  7. Satellite::~Satellite()
  8. {
  9. delete []x;
  10. delete []y;
  11. }

2.2.1、时间窗口求解方法

mianwindow.cpp中的,主要看方法,代码的注释非常超级终极无敌tm详细,我认为我说的再多用处也不大,不如你们好好看看这个代码。

解释:设置bool类型的变量flag,一开始设置为false 若某一刻城市被服务,将flag置为true。 若某一刻不被服务,同时flag为true,说明产生了一个时间窗口 通过timeSlot的构造函数创建对象,将其 push_back到该城市的vector<timeSlor>容器中。同时flag置为false。

然后我此处只求了时间窗口,还有时间间隙呢,那么时间间隙我不太懂意思,有两种解释。

一:城市不被服务的时间段就是时间间隙。

二、两个时间窗口之间产生一个时间间隙。

请自己体会,我在课设中用的是第二种解释,你们可以去问老师到底是哪种。

只要弄明白下列代码,基本没什么问题了,时间间隙大不了你们自己写一个timeGap,或者通过方法用窗口求间隙,很简单的。当时我就是懒得再写一个timeGap了,现在想想,确实写一个会比较好。

  时间窗口最大最小值、累计值就不要多说了吧?你好好想想TimeSlot里我为什么要写length,tnn的遍历一遍这个城市的QVctor<TimeSlot>容器不就有最大最小和累计了吗!!!!

间隙同理哈。

  1. //读取卫星信息
  2. void MainWindow::ReadFile(int number)
  3. {
  4. ifstream ifs;
  5. switch (number)
  6. {
  7. case 0:
  8. {
  9. ifs.open("D:/vc/z/myEarth/Position_0.txt");
  10. break;
  11. }
  12. case 1:
  13. {
  14. ifs.open("D:/vc/z/myEarth/Position_1.txt");
  15. break;
  16. }
  17. case 2:
  18. {
  19. ifs.open("D:/vc/z/myEarth/Position_2.txt");
  20. break;
  21. }
  22. case 3:
  23. {
  24. ifs.open("D:/vc/z/myEarth/Position_3.txt");
  25. break;
  26. }
  27. case 4:
  28. {
  29. ifs.open("D:/vc/z/myEarth/Position_4.txt");
  30. break;
  31. }
  32. case 5:
  33. {
  34. ifs.open("D:/vc/z/myEarth/Position_5.txt");
  35. break;
  36. }
  37. case 6:
  38. {
  39. ifs.open("D:/vc/z/myEarth/Position_6.txt");
  40. break;
  41. }
  42. case 7:
  43. {
  44. ifs.open("D:/vc/z/myEarth/Position_7.txt");
  45. break;
  46. }
  47. case 8:
  48. {
  49. ifs.open("D:/vc/z/myEarth/Position_8.txt");
  50. break;
  51. }
  52. default:
  53. {
  54. return;
  55. }
  56. }
  57. //将每一秒的信息读入
  58. for(int i = 0; i < 86400; i++)
  59. {
  60. ifs>>satellite[number].x[i]>>satellite[number].y[i];//读入第number个卫星的第i时刻的位置信息
  61. }
  62. ifs.close();
  63. }
  64. //求平方
  65. double culSquare(double a)
  66. {
  67. return a*a;
  68. }
  69. //请在mainwindow的构造函数中执行sInit(),初始化,这样我们一运行就把所有城市的时间窗口求完了
  70. void MainWindow::sInit()
  71. {
  72. //其实半径甚至就是一样
  73. /*
  74. satellite[0].radius = 7.00681;
  75. satellite[1].radius = 7.00679;
  76. satellite[2].radius = 7.00681;
  77. satellite[3].radius = 7.0068;
  78. satellite[4].radius = 7.0068;
  79. satellite[5].radius = 7.00682;
  80. satellite[6].radius = 7.00679;
  81. satellite[7].radius = 7.0068;
  82. satellite[8].radius = 7.00682;
  83. */
  84. //一个循环 每个卫星每秒钟对应的x ,y读进来
  85. for(int i = 0; i < 9; i++)
  86. {
  87. ReadFile(i);
  88. }
  89. int start = 0;
  90. //将各城市的时间窗口计算出来,外循环遍历城市
  91. for(int i = 0; i < 19; i++)
  92. {
  93. bool flag = false;//记录城市是否被卫星星座覆盖
  94. //中间循环遍历时间
  95. for(int j = 0; j < 86400; j++)
  96. {
  97. //内层循环遍历卫星,时间复杂度较高。
  98. int number =0;//当前时间段未提供服务的卫星个数
  99. for(int k = 0; k < 9; k++)
  100. {
  101. //判断城市是否在该卫星的搜索范围内,看方程(x-x0)*(x-x0) + (y-y0)*(y-y0)是否小于等于radius
  102. //第i个城市的x-该卫星的x,即经度longitude,y即纬度latitude
  103. //第k个卫星在第j秒的数值
  104. if((culSquare(theCityList.city[i].longitude - satellite[k].x[j]) + culSquare(theCityList.city[i].latitude - satellite[k].y[j])) <= culSquare(radius))
  105. {
  106. //如果该时间段处在星座范围内,且flag标记false,说明此时刻开始进入星座的范围
  107. if(!flag)
  108. {
  109. start = j;//j就是当前时间
  110. flag = true;//标记被覆盖
  111. }
  112. break;//退出当前卫星循环,因为只要有一个卫星提供就算星座在提供
  113. }
  114. //执行到这一步,说明此卫星没有提供服务,Number++
  115. number++;
  116. //若9个
  117. if(flag && number == 9)
  118. {
  119. //此时不再星座内,但是flag却为true,说明有了一个时间窗口出现
  120. //传入start,和结束时间j - 1
  121. TimeSlot t(start, j - 1);
  122. //把tpush给该城市的时间窗口VEctor
  123. theCityList.city[i].slot.push_back(t);
  124. //然后把flag置为false
  125. flag = false;
  126. }
  127. }
  128. }
  129. }
  130. /*
  131. ifstream ifs1;
  132. ifs1.open("D:/vc/z/myEarth/us.txt");
  133. for(int i = 0; i < 3369; i++)
  134. {
  135. ifs1>>point[i].longitude>>point[i].latitude;
  136. }
  137. ifs1.close();
  138. */
  139. }

3、最后

最后一篇文章我会把全部资源发到百度云,里面包含克莱姆法则的预处理、最重要的qt源程序本体、还有美国多边形的分割。如果你们现在弄的不是美国,也不要紧张,我会把这种类似问题的方法讲解的一清二楚。不过我看学长弄的是求区域时间间隙最小最大点啥的,用了粒子群优化算法那个,我怀疑你们应该搞的是别的。不过我还是会把这种某国、某区域多边形的分割方法放出来,万一你们今年搞的是什么英国、澳大利亚啥的呢hh。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/544061
推荐阅读
相关标签
  

闽ICP备14008679号