package com.bim.rrt_20190529;
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import java.util.ArrayList;
public class Tree {
Node root;//起点位置
ArrayList<Node> nodeArrayList;
public Tree(Node node) {
root = new Node(node, 0, Double.POSITIVE_INFINITY, null);
nodeArrayList = new ArrayList<Node>();
nodeArrayList.add(root);
}
/**
* 存入节点
* @param parent
* @param child
*/
public void add(Node parent, Node child) {
parent.addChild(child);
nodeArrayList.add(child);
child.setParent(parent);
}
/**
* 移除点
* @param node
*/
public void remove(Node node) {
node.getParent().removeChild(node);
nodeArrayList.remove(node);
}
/**
* 点是否存在
* @param nodeReq
* @return
*/
public boolean contains(Node nodeReq) {
return nodeArrayList.contains(nodeReq);
}
/**
* 选择离随机点最近的点
* @param randomNode
* @return
*/
public Node nearestNode(Node randomNode) {
//System.out.println("计算距离:x="+randomNode.getX()+" y="+randomNode.getX()+" z="+randomNode.getZ());
//System.out.println("计算距离:x="+root.getX()+" y="+root.getX()+" z="+root.getZ());
double minDistance = distance(root, randomNode);//随机点和起点之间的距离
Node nearestNode = root;
for (Node node : nodeArrayList) {//遍历树上所有节点
double currentDistance = distance(node, randomNode);//随机点和遍历点之间的距离
if (currentDistance < minDistance) {
minDistance = currentDistance;
nearestNode = node;
}
}
return nearestNode;
}
/**
* 计算两个点之间的距离
* @param node1
* @param node2
* @return
*/
private double distance(Node node1,Node node2) {
return sqrt(pow(node1.getX() - node2.getX(), 2) + pow(node1.getY() - node2.getY(), 2));
}
}