Newer
Older
CactusServer / src / main / java / framework / AI / Plan.java
y-ota on 10 May 2018 1 KB 初うp
  1. package framework.AI;
  2.  
  3. import java.util.LinkedList;
  4.  
  5. import javax.vecmath.Point3d;
  6. import javax.vecmath.Vector3d;
  7.  
  8. import framework.model3D.Position3D;
  9.  
  10. public class Plan {
  11. private LinkedList<Location> path; // 計画内容を表すパス
  12. private int currentLoc = 0; // パス上の現在の Location
  13.  
  14. /**
  15. * 複数の通過点を持つ計画
  16. * @param locationPath
  17. */
  18. public Plan(LinkedList<Location> locationPath) {
  19. path = locationPath;
  20. currentLoc = locationPath.size() - 1;
  21. }
  22. /**
  23. * スタートとゴールをダイレクトに結ぶ計画
  24. * @param start
  25. * @param goal
  26. */
  27. public Plan(Location start, Location goal) {
  28. path = new LinkedList<Location>();
  29. path.add(goal);
  30. path.add(start);
  31. currentLoc = 1;
  32. }
  33.  
  34. /**
  35. * 現在の Location を取得する
  36. * @return 現在の Location, すでにゴールに着いているときは null を返す
  37. */
  38. public Location getCurrentLocation() {
  39. if (currentLoc <= 0) return null;
  40. return path.get(currentLoc);
  41. }
  42.  
  43. /**
  44. * 次の Location を取得する
  45. * @return 次の Location, すでにゴールに着いているときは null を返す
  46. */
  47. public Location getNextLocation() {
  48. if (currentLoc <= 0) return null;
  49. return path.get(currentLoc - 1);
  50. }
  51.  
  52. /**
  53. * 現在の座標値を元に、現在の Location を更新する
  54. * @param position 現在の座標値
  55. * @return 更新した --- true, 以前のまま --- false
  56. */
  57. public boolean updateCurrentLocation(Position3D position) {
  58. Vector3d toCurrentPosition = position.getVector3d();
  59. Location curLocation = getCurrentLocation();
  60. if (curLocation == null) return true;
  61. toCurrentPosition.sub(curLocation.getCenter());
  62. double distanceToCurrentPosition = toCurrentPosition.length();
  63. Vector3d toNextLocation = new Vector3d(getNextLocation().getCenter());
  64. toNextLocation.sub(curLocation.getCenter());
  65. double distanceToNextLocation = toNextLocation.length();
  66. if (distanceToCurrentPosition >= distanceToNextLocation) {
  67. // 次の Location を通り過ぎた場合
  68. currentLoc--;
  69. return true;
  70. }
  71. return false;
  72. }
  73.  
  74. }