Beispiel #1
0
  public void move(Path path, boolean checkStock) throws SOSActionException {
    if (!(me.me() instanceof Human)) {
      log().warn("can't use move in Center Agent " + me + "\n");
      return;
    }
    if (path == null) {
      log().error("move to null??....doing random walk");
      ((PlatoonAgent<?>) me).randomWalk(true);
    }

    log().debug("MOVE TO : " + path + "\n");
    if (checkStock) checkStock(path);
    Point2D xy = path.getDestination().second();

    me.informationStacker.addInfo(me.model(), new MoveAction(path));
    me.send(
        new AKMove(me.getID(), me.model().time(), path.getIds(), (int) xy.getX(), (int) xy.getY()));
    throw new SOSActionException("MoveXY(" + path + ", " + xy + ")");
  }
Beispiel #2
0
  private void computeCenter(int[] apexes) {

    rescuecore2.geometry.Point2D p = SOSGeometryTools.computeCentroid(apexes);
    centerX = (int) p.getX();
    centerY = (int) p.getY();
    if (apexes.length < 6) return;
    try {
      Point2D point1 = null, point2 = null, middlePoint = null;
      ArrayList<rescuecore2.geometry.Point2D> twoPointOutOfLine = null;
      if (!contains(centerX, centerY)) { // if the point is not inside the polygon
        /////////////////////// finding a point inside polygon////////////////
        FOR:
        for (int i = 0; i < apexes.length - 2; i += 2) {
          point1 = new rescuecore2.geometry.Point2D(apexes[i], apexes[i + 1]);
          point2 = new rescuecore2.geometry.Point2D(apexes[i + 2], apexes[i + 3]);
          middlePoint =
              new rescuecore2.geometry.Point2D(
                  (apexes[i] + apexes[i + 2]) / 2, (apexes[i + 1] + apexes[i + 3]) / 2);
          twoPointOutOfLine =
              Utility.get2PointsAroundAPointOutOfLine(point1, point2, middlePoint, 2);
          for (rescuecore2.geometry.Point2D point2d : twoPointOutOfLine) {
            if (contains(point2d.getX(), point2d.getY())) {
              centerX = (int) point2d.getX();
              centerY = (int) point2d.getY();
              break FOR;
            }
          }
        }
        /*
        if (!contains(centerX, centerY)) {
        	debug.show("SOS Shape", new ShapeDebugFrame.AWTShapeInfo(this, "apexes=" + Arrays.toString(apexes), Color.blue, false),
        			new ShapeDebugFrame.Point2DShapeInfo(point1, "Point 1", Color.red, true),
        			new ShapeDebugFrame.Point2DShapeInfo(point2, "Point 2", Color.green, true),
        			new ShapeDebugFrame.Point2DShapeInfo(middlePoint, "middlePoint", Color.pink, true),
        			new ShapeDebugFrame.Point2DShapeInfo(twoPointOutOfLine.get(0), "twoPointOutOfLine 1", Color.magenta, true),
        			new ShapeDebugFrame.Point2DShapeInfo(twoPointOutOfLine.get(1), "twoPointOutOfLine 2", Color.black, true),
        			new ShapeDebugFrame.DetailInfo("area:" + SOSGeometryTools.computeAreaUnsigned(apexes))
        			);
        }
        */
        ///////////////////////////////////////////////////////////////////////
      }
    } catch (Exception e) {
      e.printStackTrace();
      System.err.println(this.getClass().getSimpleName() + " have error" + e.getMessage());
    }
  }
Beispiel #3
0
 @Override
 public int getWeightFromXYToXY(Area area, Point2D start, Point2D end) {
   int dstlength = ((int) start.distance(end)) / MoveConstants.DIVISION_UNIT;
   if (area instanceof Building || !area.isBlockadesDefined()) return dstlength;
   ReachablityState rs = Reachablity.isReachable((Road) area, start, end);
   switch (rs) {
     case Close:
       return MoveConstants.UNREACHABLE_COST_FOR_GRAPH_WEIGTHING;
     case FoggyClose:
       return dstlength * 5;
     case FoggyOpen:
       return dstlength * 2;
     default:
       return dstlength;
   }
 }
Beispiel #4
0
  private void check2CycleStock() throws SOSActionException {
    CycleInformations cycleinfo1 = me.informationStacker.getInformations(1);
    CycleInformations cycleinfo2 = me.informationStacker.getInformations(2);
    if (!(cycleinfo1.getAct() instanceof MoveAction)
        || cycleinfo1.getAct() instanceof StockMoveAction) return;
    if (!(cycleinfo2.getAct() instanceof MoveAction)
        || cycleinfo1.getAct() instanceof StockMoveAction) return;

    Path path1 = ((MoveAction) cycleinfo1.getAct()).getPath();
    //			Path path2 = ((MoveAction) cycleinfo2.getAct()).getPath();
    log().info("Two(2) cycle move ....");
    log().debug("current position:" + me.me().getAreaPosition());
    log().debug("1 cycle ago position:" + cycleinfo1.getPositionPair());
    log().debug("2 cycle ago position:" + cycleinfo2.getPositionPair());
    if (!cycleinfo1.getPositionPair().first().equals(cycleinfo2.getPositionPair().first())) return;
    if (!cycleinfo1.getPositionPair().first().equals(me.me().getAreaPosition())) return;
    if (SOSGeometryTools.getDistance(
            cycleinfo1.getPositionPair().second(), cycleinfo2.getPositionPair().second())
        > MoveConstants.TRAFFIC_CHECKING_DISTANCE) return;

    //////////////// Stock Occured
    log().debug("2 cycle stock occured!!!!!!!");

    ArrayList<EntityID> entityPath = new ArrayList<EntityID>();
    Area area = me.me().getAreaPosition();
    log().debug("Current Position:" + area);
    entityPath.add(area.getID());
    Edge ed;
    Area ne;
    if (path1.getIds().size() > 0 && !path1.getIds().get(0).equals(area.getID())) {
      ne = (Area) me.model().getEntity(path1.getIds().get(0));
      ed = area.getEdgeTo(ne);
    } else if (path1.getIds().size() > 1 && path1.getIds().get(0).equals(area.getID())) {
      ne = (Area) me.model().getEntity(path1.getIds().get(1));
      ed = area.getEdgeTo(ne);
    } else {
      ne = area.getNeighbours().get(0);
      ed = area.getEdgeTo(ne);
    }
    log().debug("ne:" + ne + " ed:" + ed + " last move path:" + path1);
    if (ed == null) {
      log().error("[Move]edge is null!!!!!some problem!!!!");
      ne = area.getNeighbours().get(0);
      ed = area.getEdgeTo(ne);
      log().debug("changed!!!! ne:" + ne + " ed:" + ed + " last move path:" + path1);
    }
    Point2D destXYAPointNearEdge;
    if (ed != null) {
      //			if (area instanceof Road) {
      Pair<Point2D, Point2D> points = getAPointInReachblePartEdges(area, ed);
      destXYAPointNearEdge = points.second();
      //			} else {
      //				Line2D wallLine = ed.getLine();// new Line2D(edge.getStartX(), edge.getStartY(),
      // edge.getEndX() - edge.getStartX(), edge.getEndY() - edge.getStartY());
      //				// ppp.add(new ShapeDebugFrame.Line2DShapeInfo(wallLine, "edge", Color.white.darker(),
      // false, false));
      //				Vector2D offset;
      //				if (lastStockTime < me.time() - 4) {
      //					if (AliGeometryTools.havecorrectDirection(area)) {
      //						offset = wallLine.getDirection().getNormal().normalised().scale(1500);
      //					} else {
      //						offset = wallLine.getDirection().getNormal().normalised().scale(-1500);
      //					}
      //				} else {
      //					if (!AliGeometryTools.havecorrectDirection(area)) {
      //						offset = wallLine.getDirection().getNormal().normalised().scale(1500);
      //					} else {
      //						offset = wallLine.getDirection().getNormal().normalised().scale(-1500);
      //					}
      //				}
      //				destXYAPointNearEdge = ed.getMidPoint().plus(offset);
      //			}
    } else {
      log().error("[Move]edge is null!!!!!some problem!!!!");
      destXYAPointNearEdge = area.getPositionPair().second();
    }
    log().debug("dest area for stock:" + area + " dst point:" + destXYAPointNearEdge);
    me.send(
        new AKMove(
            me.getID(),
            me.time(),
            entityPath,
            (int) destXYAPointNearEdge.getX(),
            (int) destXYAPointNearEdge.getY()));
    Path path =
        new Path(
            null,
            null,
            entityPath,
            me.me().getPositionPair(),
            new Pair<Area, Point2D>(area, destXYAPointNearEdge),
            false);
    me.informationStacker.addInfo(me.model(), new StockMoveAction(path));
    //		log().warn("Traffic Handeling should be change due to server doesn't support AKMotion");
    lastStockTime = me.time();
    throw new SOSActionException("Move Stock(" + area + " " + destXYAPointNearEdge + ")");
  }
Beispiel #5
0
  private void checkEarlyStock(Path path) throws SOSActionException {
    Area source = me.me().getAreaPosition();
    if (me.informationStacker.getInformations(1).getAct() instanceof MoveAction
        && me.informationStacker.getInformations(1).getPositionPair().first() instanceof Building) {
      log()
          .debug(
              "last act is move and current position is in building ==> don't check early stock");
      return;
    }
    if (me.informationStacker.getInformations(1).getAct() instanceof StockMoveAction) {
      log().debug("last act is stock move ==> don't check early stock");
      return;
    }

    if (source instanceof Building) {
      log().debug("early stock detected!!! agent is in " + source);
      ArrayList<EntityID> entityPath = new ArrayList<EntityID>();
      entityPath.add(source.getID());
      Area second = null;
      Area third = null;

      if (path.getIds().size() > 0 && !path.getIds().get(0).equals(source.getID())) {
        second = (Area) me.model().getEntity(path.getIds().get(0));
        if (path.getIds().size() > 1) third = (Area) me.model().getEntity(path.getIds().get(1));
      } else if (path.getIds().size() > 1 && path.getIds().get(0).equals(source.getID())) {
        second = (Area) me.model().getEntity(path.getIds().get(1));
        if (path.getIds().size() > 2) third = (Area) me.model().getEntity(path.getIds().get(2));
      } else {
        log().warn("move path size is 0 can't checkEarlyStock!!!");
        return;
      }
      if (second == null) {
        log().warn("second is null can't checkEarlyStock!!!");
        return;
      } else {
        ArrayList<Edge> edges = second.getEdgesTo(source);
        int minDistance = Integer.MAX_VALUE;
        for (Edge edge : edges) {
          minDistance =
              (int)
                  Math.min(
                      minDistance, SOSGeometryTools.distance(edge, me.me().getPositionPoint()));
        }
        //				Edge fedge = second.getEdgeTo(source);
        //				if (SOSGeometryTools.distance(fedge, me.me().getPositionPoint()) <
        // MoveConstants.ENTRACE_DISTANCE_MM+1000)
        //					return;
        if (minDistance < MoveConstants.ENTRACE_DISTANCE_MM + 1000) {
          log().debug("I'm too neat to edge in building... no need to check early stock");
          return;
        }
        entityPath.add(second.getID());
      }
      if (third == null) {
        log().debug("Move path is too small!!! no need to early stock handle");
        return;
      } else {
        Edge ed = second.getEdgeTo(third);
        Point2D destXYAPointNearEdge;
        if (ed != null) {
          Line2D wallLine =
              ed
                  .getLine(); // new Line2D(edge.getStartX(), edge.getStartY(), edge.getEndX() -
                              // edge.getStartX(), edge.getEndY() - edge.getStartY());
          // ppp.add(new ShapeDebugFrame.Line2DShapeInfo(wallLine, "edge", Color.white.darker(),
          // false, false));
          Vector2D offset;
          if (AliGeometryTools.havecorrectDirection(second)) {
            offset = wallLine.getDirection().getNormal().normalised().scale(15);
          } else {
            offset = wallLine.getDirection().getNormal().normalised().scale(-15);
          }
          destXYAPointNearEdge = ed.getMidPoint().plus(offset);
        } else {
          log().error("[Move]edge is null!!!!!some problem!!!!");
          destXYAPointNearEdge = second.getPositionPair().second();
        }
        log()
            .debug(
                "source:"
                    + source
                    + " dest area for stock:"
                    + second
                    + " dst point:"
                    + destXYAPointNearEdge);
        me.send(
            new AKMove(
                me.getID(),
                me.time(),
                entityPath,
                (int) destXYAPointNearEdge.getX(),
                (int) destXYAPointNearEdge.getY()));
        path =
            new Path(
                null,
                null,
                entityPath,
                me.me().getPositionPair(),
                new Pair<Area, Point2D>(second, destXYAPointNearEdge),
                false);
        me.informationStacker.addInfo(me.model(), new StockMoveAction(path));
        throw new SOSActionException(
            "Move Stock(" + source + "," + second + " " + destXYAPointNearEdge + ")");
      }
    }
  }
Beispiel #6
0
 @Override
 public void write(OutputStream out) throws IOException {
   writeDouble(value.getX(), out);
   writeDouble(value.getY(), out);
 }
Beispiel #7
0
 // Morteza2011*****************************************************************
 public static ArrayList<SOSArea> sortEdges(
     StandardEntity a,
     ArrayList<Edge> removedExtraEdgesBlock1,
     ArrayList<Edge> removedExtraEdgesBlock2,
     boolean setDirection)
     throws ReachablityException {
   ArrayList<SOSArea> areaList = new ArrayList<SOSArea>();
   ArrayList<ArrayList<Edge>> edgeList = new ArrayList<ArrayList<Edge>>(2);
   ArrayList<Edge> sortedEdges = new ArrayList<Edge>();
   edgeList.add(new ArrayList<Edge>(removedExtraEdgesBlock1));
   edgeList.add(new ArrayList<Edge>(removedExtraEdgesBlock2));
   short index = 0;
   short[] indexes = {0, 0};
   boolean firstTime = true;
   while (indexes[0] < edgeList.get(0).size() || indexes[1] < edgeList.get(1).size()) {
     Point2D start, end;
     if (indexes[0] < edgeList.get(0).size()) {
       start = edgeList.get(0).get(indexes[0]).getStart();
       end = edgeList.get(0).get(indexes[0]).getEnd();
       sortedEdges.add(edgeList.get(0).get(indexes[0]));
       indexes[0]++;
       index = 0;
     } else {
       start = edgeList.get(1).get(indexes[1]).getStart();
       end = edgeList.get(1).get(indexes[1]).getEnd();
       sortedEdges.add(edgeList.get(1).get(indexes[1]));
       indexes[1]++;
       index = 1;
     }
     while (!end.isEqualTo(start)) {
       if (indexes[index] < edgeList.get(index).size()
           && edgeList.get(index).get(indexes[index]).getStart().equals(end)) {
         sortedEdges.add(edgeList.get(index).get(indexes[index]));
         indexes[index]++;
       } else if (indexes[1 - index] < edgeList.get(1 - index).size()
           && edgeList.get(1 - index).get(indexes[1 - index]).getStart().equals(end)) {
         firstTime = false;
         index = (short) (1 - index);
         sortedEdges.add(edgeList.get(index).get(indexes[index]));
         indexes[index]++;
       } else {
         boolean found = false;
         index = (short) (1 - index);
         short listSize = (short) (edgeList.get(index).size() - indexes[index]);
         for (short i = 0; i < listSize; i++) {
           if (!edgeList.get(index).get(indexes[index]).getStart().equals(end)) {
             edgeList.get(index).add(edgeList.get(index).get(indexes[index]));
             indexes[index]++;
           } else {
             found = true;
             firstTime = false;
             break;
           }
         }
         if (!found) {
           if (areaList.size() == 0) {
             if (firstTime && !setDirection) {
               ArrayList<Edge> newList = new ArrayList<Edge>(removedExtraEdgesBlock2);
               setEqualDirection(newList);
               try {
                 return sortEdges(a, removedExtraEdgesBlock1, newList, true);
               } catch (ReachablityException e) {
                 throw new ReachablityException("need ReExpand!!!");
               }
             } else throw new ReachablityException("need ReExpand!!!");
           } else return areaList;
         }
         sortedEdges.add(edgeList.get(index).get(indexes[index]));
         indexes[index]++;
       }
       end = sortedEdges.get(sortedEdges.size() - 1).getEnd();
     }
     SOSArea area = new SOSArea(sortedEdges);
     if (sortedEdges.size() > 2) areaList.add(area);
     sortedEdges.clear();
   }
   if (edgeList.get(0).size() != indexes[0]) {
     log(a).warn("Sorting has been completed but 1List has elements yet!!!");
   }
   if (edgeList.get(1).size() != indexes[1]) {
     log(a).warn("Sorting has been completed but 1List has elements yet!!!");
   }
   return areaList;
 }