这段代码每一句多是什么意思
时间: 2023-08-04 08:03:26 浏览: 53
好的,以下是这段代码每一句话的解释:
```
double AStar::getDiagHeu(GridNodePtr node1, GridNodePtr node2) {
double dx = abs(node1->index(0) - node2->index(0));
double dy = abs(node1->index(1) - node2->index(1));
double dz = abs(node1->index(2) - node2->index(2));
double h = 0.0;
int diag = min(min(dx, dy), dz);
dx -= diag;
dy -= diag;
dz -= diag;
if (dx == 0) {
h = 1.0 * sqrt(3.0) * diag + sqrt(2.0) * min(dy, dz) + 1.0 * abs(dy - dz);
}
if (dy == 0) {
h = 1.0 * sqrt(3.0) * diag + sqrt(2.0) * min(dx, dz) + 1.0 * abs(dx - dz);
}
if (dz == 0) {
h = 1.0 * sqrt(3.0) * diag + sqrt(2.0) * min(dx, dy) + 1.0 * abs(dx - dy);
}
return h;
}
```
1. 定义函数 `getDiagHeu`,它接受两个 `GridNodePtr` 类型的指针参数 `node1` 和 `node2`,并返回一个 `double` 类型的值。
2. 计算节点 `node1` 和节点 `node2` 在三个坐标轴上的距离(即 `dx`,`dy` 和 `dz`),并将它们的绝对值存储在 `dx`,`dy` 和 `dz` 变量中。
3. 定义一个 `double` 类型的变量 `h` 并将其初始化为 0。
4. 计算 `dx`,`dy` 和 `dz` 中的最小值,并将其存储在 `diag` 变量中。
5. 将 `dx`,`dy` 和 `dz` 中的最小值 `diag` 从 `dx`,`dy` 和 `dz` 中减去。
6. 如果 `dx` 等于 0,则说明节点 `node1` 和节点 `node2` 在 x 轴上对齐,因此使用对角线距离计算 `h` 的值。
7. 如果 `dy` 等于 0,则说明节点 `node1` 和节点 `node2` 在 y 轴上对齐,因此使用对角线距离计算 `h` 的值。
8. 如果 `dz` 等于 0,则说明节点 `node1` 和节点 `node2` 在 z 轴上对齐,因此使用对角线距离计算 `h` 的值。
9. 返回启发式估计值 `h`。
```
double AStar::getManhHeu(GridNodePtr node1, GridNodePtr node2) {
double dx = abs(node1->index(0) - node2->index(0));
double dy = abs(node1->index(1) - node2->index(1));
double dz = abs(node1->index(2) - node2->index(2));
return dx + dy + dz;
}
```
1. 定义函数 `getManhHeu`,它接受两个 `GridNodePtr` 类型的指针参数 `node1` 和 `node2`,并返回一个 `double` 类型的值。
2. 计算节点 `node1` 和节点 `node2` 在三个坐标轴上的距离(即 `dx`,`dy` 和 `dz`),并将它们的绝对值存储在 `dx`,`dy` 和 `dz` 变量中。
3. 返回曼哈顿距离 `dx + dy + dz` 作为启发式估计值。
```
double AStar::getEuclHeu(GridNodePtr node1, GridNodePtr node2) {
return (node2->index - node1->index).norm();
}
```
1. 定义函数 `getEuclHeu`,它接受两个 `GridNodePtr` 类型的指针参数 `node1` 和 `node2`,并返回一个 `double` 类型的值。
2. 计算节点 `node1` 和节点 `node2` 之间的欧几里得距离,并返回该距离作为启发式估计值。
```
vector<GridNodePtr> AStar::retrievePath(GridNodePtr current) {
vector<GridNodePtr> path;
path.push_back(current);
while (current->cameFrom != NULL) {
current = current->cameFrom;
path.push_back(current);
}
return path;
}
```
1. 定义函数 `retrievePath`,它接受一个 `GridNodePtr` 类型的指针参数 `current`,并返回一个 `vector<GridNodePtr>` 类型的值。
2. 创建一个 `path` 变量,它是 `GridNodePtr` 类型的指针的向量。
3. 将 `current` 添加到 `path` 中。
4. 如果 `current` 的 `cameFrom` 属性不为 `NULL`,则将 `current` 更新为 `current` 的 `cameFrom` 属性,同时将其添加到 `path` 中。
5. 重复步骤 4,直到 `current` 的 `cameFrom` 属性为 `NULL`。
6. 返回 `path` 向量,其中包含从终点到起点的所有节点。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)