package framework.AI; import java.util.LinkedList; import java3d.Point3d; import java3d.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; } }