|  |  |  | 
|---|
|  |  |  | import lombok.Data; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.io.Serializable; | 
|---|
|  |  |  | import java.util.Optional; | 
|---|
|  |  |  | import java.util.Objects; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 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); | 
|---|
|  |  |  | } 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 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public boolean equals(Object obj) { | 
|---|
|  |  |  | if (this == obj) return true; | 
|---|
|  |  |  | if (!(obj instanceof NavigateNode)) return false; | 
|---|
|  |  |  | NavigateNode that = (NavigateNode) obj; | 
|---|
|  |  |  | return this.x == that.x && this.y == that.y; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public int hashCode() { | 
|---|
|  |  |  | return Objects.hash(x, y); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|