利用DEM数据计算填方挖方的c++代码,并解释一下各个代码是什么意思
时间: 2024-02-11 11:08:55 浏览: 144
下面是利用 DEM 数据计算填方挖方的 C++ 代码:
```c++
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main()
{
// 读取 DEM 数据
ifstream fin("dem.txt");
int rows, cols;
fin >> rows >> cols;
double** dem = new double*[rows];
for (int i = 0; i < rows; i++) {
dem[i] = new double[cols];
for (int j = 0; j < cols; j++) {
fin >> dem[i][j];
}
}
fin.close();
// 计算填方挖方
double fill_volume = 0, cut_volume = 0;
double cell_size = 10; // DEM 数据中每个像元的大小(米)
double z = 1; // 每层高度(米)
for (int i = 0; i < rows - 1; i++) {
for (int j = 0; j < cols - 1; j++) {
double dz1 = dem[i][j + 1] - dem[i][j];
double dz2 = dem[i + 1][j + 1] - dem[i + 1][j];
double dz3 = dem[i + 1][j] - dem[i][j];
double dz4 = dem[i + 1][j + 1] - dem[i][j + 1];
double dz5 = dem[i + 1][j] - dem[i][j];
double dz6 = dem[i + 1][j + 1] - dem[i][j];
double dzmax = max(max(max(max(dz1, dz2), dz3), dz4), dz5);
double dzmin = min(min(min(min(dz1, dz2), dz3), dz4), dz5);
double volume = dzmax * cell_size * cell_size * z;
if (dzmax > 0 && dzmin > 0) {
fill_volume += volume;
} else if (dzmax < 0 && dzmin < 0) {
cut_volume += volume;
} else {
fill_volume += volume / 2;
cut_volume += volume / 2;
}
}
}
// 输出结果
cout << "Fill volume: " << fill_volume << " cubic meters" << endl;
cout << "Cut volume: " << cut_volume << " cubic meters" << endl;
// 释放内存
for (int i = 0; i < rows; i++) {
delete[] dem[i];
}
delete[] dem;
return 0;
}
```
代码中的各个部分的含义如下:
- `ifstream` 是 C++ 中的文件输入流,用于读取文件中的数据。
- `int rows, cols;` 定义行数和列数。
- `double** dem = new double*[rows];` 定义 DEM 数据的二维数组。
- `for (int i = 0; i < rows; i++) { dem[i] = new double[cols]; ... }` 读取 DEM 数据并存储到二维数组中。
- `double fill_volume = 0, cut_volume = 0;` 定义填方和挖方体积。
- `double cell_size = 10;` 定义 DEM 数据中每个像元的大小(米)。
- `double z = 1;` 定义每层高度(米)。
- `for (int i = 0; i < rows - 1; i++) { for (int j = 0; j < cols - 1; j++) { ... } }` 计算填方和挖方体积。
- `double dz1 = dem[i][j + 1] - dem[i][j];` 计算当前像元上方的高度差。
- `double dz2 = dem[i + 1][j + 1] - dem[i + 1][j];` 计算当前像元右上方的高度差。
- `double dz3 = dem[i + 1][j] - dem[i][j];` 计算当前像元右边的高度差。
- `double dz4 = dem[i + 1][j + 1] - dem[i][j + 1];` 计算当前像元右下方的高度差。
- `double dz5 = dem[i + 1][j] - dem[i][j];` 计算当前像元下方的高度差。
- `double dz6 = dem[i + 1][j + 1] - dem[i][j];` 计算当前像元左下方的高度差。
- `double dzmax = max(max(max(max(dz1, dz2), dz3), dz4), dz5);` 计算当前像元周围的高度差的最大值。
- `double dzmin = min(min(min(min(dz1, dz2), dz3), dz4), dz5);` 计算当前像元周围的高度差的最小值。
- `double volume = dzmax * cell_size * cell_size * z;` 计算当前像元周围的体积。
- `if (dzmax > 0 && dzmin > 0) { fill_volume += volume; ... }` 如果当前像元周围的地形为填方,则将体积加入填方体积中。
- `else if (dzmax < 0 && dzmin < 0) { cut_volume += volume; ... }` 如果当前像元周围的地形为挖方,则将体积加入挖方体积中。
- `else { fill_volume += volume / 2; cut_volume += volume / 2; }` 如果当前像元周围的地形为平地,则将体积平均分配到填方和挖方体积中。
- `cout << "Fill volume: " << fill_volume << " cubic meters" << endl;` 输出填方体积。
- `cout << "Cut volume: " << cut_volume << " cubic meters" << endl;` 输出挖方体积。
- `for (int i = 0; i < rows; i++) { delete[] dem[i]; } delete[] dem;` 释放内存。
阅读全文