package framework.AI;
import java.util.LinkedList;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import framework.model3D.Position3D;
public class Plan {
private LinkedList<Location> path; // 計画内容を表すパス
private int currentLoc = 0; // パス上の現在の Location
/**
* 複数の通過点を持つ計画
* @param locationPath
*/
public Plan(LinkedList<Location> locationPath) {
path = locationPath;
currentLoc = locationPath.size() - 1;
}
/**
* スタートとゴールをダイレクトに結ぶ計画
* @param start
* @param goal
*/
public Plan(Location start, Location goal) {
path = new LinkedList<Location>();
path.add(goal);
path.add(start);
currentLoc = 1;
}
/**
* 現在の Location を取得する
* @return 現在の Location, すでにゴールに着いているときは null を返す
*/
public Location getCurrentLocation() {
if (currentLoc <= 0) return null;
return path.get(currentLoc);
}
/**
* 次の Location を取得する
* @return 次の Location, すでにゴールに着いているときは null を返す
*/
public Location getNextLocation() {
if (currentLoc <= 0) return null;
return path.get(currentLoc - 1);
}
/**
* 現在の座標値を元に、現在の Location を更新する
* @param position 現在の座標値
* @return 更新した --- true, 以前のまま --- false
*/
public boolean updateCurrentLocation(Position3D position) {
Vector3d toCurrentPosition = position.getVector3d();
Location curLocation = getCurrentLocation();
if (curLocation == null) return true;
toCurrentPosition.sub(curLocation.getCenter());
double distanceToCurrentPosition = toCurrentPosition.length();
Vector3d toNextLocation = new Vector3d(getNextLocation().getCenter());
toNextLocation.sub(curLocation.getCenter());
double distanceToNextLocation = toNextLocation.length();
if (distanceToCurrentPosition >= distanceToNextLocation) {
// 次の Location を通り過ぎた場合
currentLoc--;
return true;
}
return false;
}
}