public Roadmap(Map map, Agent agent, int numberOfSample, int depth) { this.map = map; this.agent = agent; this.depth = depth; setSamplePositionList(numberOfSample); connectPositions(); //int roadMapStartIndex = agent.position.findNearestAndConnectablePositionInRoadmap(this, map); //int roadMapGoalIndex = agent.goalPosition.findNearestAndConnectablePositionInRoadmap(this, map); //if (roadMapStartIndex != -1 && roadMapGoalIndex != -1) //{ // connectPositions(); // findMinimumPathOnGraphWithDijikstra(roadMapStartIndex, roadMapGoalIndex); //} }
public int findNearestAndConnectablePositionInRoadmap(Roadmap roadmap,Map map) { float minLen = float.MaxValue; float len; int index = -1; for (int i = 0; i < roadmap.samplePositionList.Count; i++) { len = Vector2.Distance(this.leftUpCorner, roadmap.samplePositionList[i].leftUpCorner); if (len < minLen) { if (this.isConnectable(roadmap.samplePositionList[i],map)) { minLen = len; index = i; } } } return index; }
protected override void Initialize() { // TODO: Add your initialization logic here gameMap = new Map(this, gameMapString); base.Initialize(); }
/// <summary> /// Seçilmiş harita içerisinde herhangi bu pozisyona bir serbest bir yolun olup olmadığını hesaplar. /// </summary> /// <param name="position"></param> /// <param name="map"></param> /// <returns></returns> public bool isConnectable(Position position, Map map) { Position virtualPosition = new Position(this.leftUpCorner, this.size); Vector2 direction; bool XisSame = false; bool YisSame = false; while (true) { direction = position.leftUpCorner - virtualPosition.leftUpCorner; // Yön belirlenir. direction.Normalize(); virtualPosition.leftUpCorner += direction; if (float.IsNaN(virtualPosition.leftUpCorner.X) || float.IsNaN(virtualPosition.leftUpCorner.Y)) return false; foreach (Obstacle obs in map.obstacleList) { if (virtualPosition.Intersect(obs.position)) return false; } if ((Math.Abs(virtualPosition.leftUpCorner.X - position.leftUpCorner.X) <= (Math.Abs(direction.X * 2))) && !XisSame ) { XisSame = true; virtualPosition.leftUpCorner.X = position.leftUpCorner.X; } if ((Math.Abs(virtualPosition.leftUpCorner.Y - position.leftUpCorner.Y) <= (Math.Abs(direction.Y * 2))) && !YisSame ) { YisSame = true; virtualPosition.leftUpCorner.Y = position.leftUpCorner.Y; } if (XisSame && YisSame) return true; } }
public bool isOnObstacles(Map gameMap) { foreach (Obstacle obs in gameMap.obstacleList) { if (this.Intersect(obs.position)) return true; } return false; }