예제 #1
0
 public Dijkstra(Circuit circuit) {
   super();
   this.circuit = circuit;
   dist = new double[circuit.getHeight()][circuit.getWidth()];
   /* Initialisation du tableau de distance */
   for (int i = 0; i < dist.length; i++) {
     for (int j = 0; j < dist[0].length; j++) {
       dist[i][j] = Double.POSITIVE_INFINITY;
     }
   }
   q = new PriorityBlockingQueue<Vecteur>(100, new ComparatorDijk(dist));
   l = new ArrayList<UpdateEventListener>();
   /* Initialisation du tas */
   for (Vecteur v : circuit.getListeArrivees()) {
     q.add(v);
     dist[(int) v.getX()][(int) v.getY()] = 0;
   }
   compute();
 }
예제 #2
0
  public void trouverVoisinEtMaj(Vecteur point) {
    /* Autour du point (i,j) */
    int x = (int) point.getX();
    int y = (int) point.getY();
    /* Boucle: pour di allant de -1 à 1 et dj allant de -1 à 1 */
    for (int di = -1; di <= 1; di++) {
      for (int dj = -1; dj <= 1; dj++) {
        Vecteur d = new Vecteur(x + di, y + dj);
        /* Eliminer les indices inintéressants (continue) */
        if (di == 0 && dj == 0) {
          continue;
        }
        /* Eliminer les mauvais voisins */
        if (!ToolsTerrain.isRunnable(circuit.getTerrain(d))) {
          continue;
        }

        if ((di + x >= circuit.getHeight())
            || (dj + y >= circuit.getWidth())
            || (di + x < 0)
            || (dj + y < 0)) {
          continue;
        }
        if (dist[x][y] == 0) {
          if (VTools.prodScal(circuit.getDirectionArrivee(), new Vecteur(di, dj)) > 0) {
            continue;
          }
        }
        /* Compare la nouvelle distance avec la distance actuelle */
        int poids = poids(di, dj);
        if (dist[x + di][y + dj] > dist[x][y] + poids) {
          q.remove(d);
          dist[x + di][y + dj] = dist[x][y] + poids;
          q.add(d);
        }
      }
    }
  }