| | |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Objects; |
| | | import java.util.Optional; |
| | | |
| | | /** |
| | | * A*寻路算法Node节点 |
| | | * Node节点 |
| | | */ |
| | | @Data |
| | | public class NavigateNode implements Comparable<NavigateNode>, Cloneable, Serializable { |
| | |
| | | private int z; //坐标z(高度) |
| | | |
| | | private int F; //综合花费的步数 |
| | | private int G; //已经花费的步数 |
| | | private int H; //将要花费的步数 |
| | | |
| | | private NavigateNode parent; //父节点 |
| | | private Boolean turningPoint; //是否为拐点 |
| | | private String direction; //行走方向 |
| | | private Integer lastDistance; // 距离上个节点距离 |
| | | private Integer moveDistance; // 总行走距离 |
| | | private Integer weight; // G 权重 |
| | | |
| | | private String codeData; |
| | |
| | | this.x = x; |
| | | this.y = y; |
| | | this.codeData = codeData; |
| | | } |
| | | |
| | | //通过结点的坐标和目标结点的坐标可以计算出F, G, H三个属性 |
| | | //需要传入这个节点的上一个节点和最终的结点 |
| | | public void initNode(NavigateNode father, NavigateNode end) { |
| | | this.parent = father; |
| | | if (this.parent != null) { |
| | | //走过的步数等于父节点走过的步数加一 |
| | | this.G = father.G |
| | | + Optional.ofNullable(this.lastDistance).orElse(0) |
| | | + Optional.ofNullable(this.weight).orElse(0); |
| | | } else { //父节点为空代表它是第一个结点 |
| | | this.G = 0; |
| | | } |
| | | |
| | | //以下计算方案为算法原始方案,没有去拐点方案。已被Solution计算时自动覆盖。 |
| | | //计算通过现在的结点的位置和最终结点的位置计算H值(曼哈顿法:坐标分别取差值相加) |
| | | this.H = Math.abs(this.x - end.x) + Math.abs(this.y - end.y); |
| | | this.F = this.G + this.H; |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public int hashCode() { |
| | | return Objects.hash(x, y); |
| | | } |
| | | |
| | | public void reset() { |
| | | this.F = 0; |
| | | this.G = 0; |
| | | this.H = 0; |
| | | this.parent = null; |
| | | this.turningPoint = null; |
| | | this.direction = null; |
| | | this.lastDistance = null; |
| | | this.moveDistance = null; |
| | | this.weight = null; |
| | | this.codeData = null; |
| | | } |
| | | |
| | | } |