package com.zy.acs.manager.core.service.astart; 
 | 
  
 | 
import lombok.Data; 
 | 
  
 | 
import java.io.Serializable; 
 | 
import java.util.Optional; 
 | 
  
 | 
/** 
 | 
 * A*寻路算法Node节点 
 | 
 */ 
 | 
@Data 
 | 
public class NavigateNode implements Comparable<NavigateNode>, Cloneable, Serializable { 
 | 
  
 | 
    private static final long serialVersionUID = 1L; 
 | 
  
 | 
    private int x;  //坐标x 
 | 
    private int y;  //坐标y 
 | 
    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 String codeData; 
 | 
  
 | 
    public NavigateNode(int x, int y) { 
 | 
        this.x = x; 
 | 
        this.y = y; 
 | 
    } 
 | 
  
 | 
    public NavigateNode(int x, int y, 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 
 | 
    public int compareTo(NavigateNode o) { 
 | 
        return Integer.compare(this.F, o.F); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public NavigateNode clone() { 
 | 
        try { 
 | 
            return (NavigateNode) super.clone(); 
 | 
        } catch (CloneNotSupportedException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
} 
 |