public void MoveChange(Robot robot, int turn, double fromX, double fromY, double toX, double toY) { clearUsages(movementObstacles.Values); var enumerator = getEnumerator(movementObstacles, fromX, fromY, toX, toY).GetEnumerator(); List <IMoveInfluence> usedObstacle = new List <IMoveInfluence>(); while (enumerator.MoveNext()) { IMoveInfluence movementObstacle = enumerator.Current; if (movementObstacle == null) { continue; } movementObstacle.Used = true; usedObstacle.Add(movementObstacle); Segment leadSegment = new Segment(fromX, fromY, toX, toY); Point nearestIntersect = EuclideanSpaceUtils.GetNearestIntersect(leadSegment, movementObstacle.Segments()); robot.X = nearestIntersect.X; robot.Y = nearestIntersect.Y; double prevFromX = fromX; double prevFromY = fromY; double prevToX = toX; double prevToY = toY; movementObstacle.Change(robot, turn, ref fromX, ref fromY, ref toX, ref toY); if (!fromX.DEquals(prevFromX) || !fromY.DEquals(prevFromY) || !toX.DEquals(prevToX) || toY.DEquals(prevToY)) { enumerator.Dispose(); enumerator = getEnumerator(movementObstacles, fromX, fromY, toX, toY).GetEnumerator(); } } enumerator.Dispose(); robot.X = toX; robot.Y = toY; clearUsages(usedObstacle); }
public void AddMovementObstacle(IMoveInfluence obstacle) { this.movementObstacles.Add(new Point(obstacle.X, obstacle.Y), obstacle); }