1

私は、フライトレーダーシミュレーターであるクラスプロジェクトに取り組んでいます。

2 つの飛行機が危険なほど接近すると、両方のフライトのイメージが変化し、安全な距離にあると、再びイメージが変化するという状況です。

レーダー

問題は、ほとんどの場合、これらの画像の 1 つだけが赤に変更され、どこに問題があるのか​​ わからないことです。

これは私が近さの状態を確認するために使用している方法で、非常に単純で、それらの間の距離のみを確認しています。

private void checkConflicts(ArrayList<Flight> flightsInArea) {


    for (int i = 0; i < flightsInArea.size(); i++) {
        for (int j = i + 1; j < flightsInArea.size(); j++) {

            Coordinate currentFlight1 = flightsInArea.get(i).getCurrentPosition();
            Coordinate currentFlight2 = flightsInArea.get(j).getCurrentPosition();

            double cathetusX = Math.pow((currentFlight1.getPositionX() - currentFlight2.getPositionX()), 2);
            double cathetusY = Math.pow((currentFlight1.getPositionY() - currentFlight2.getPositionY()), 2);

            double distance = Math.sqrt(cathetusX + cathetusY);

            if (distance < 100) {
                flightsInArea.get(i).establishImage(true);
                flightsInArea.get(j).establishImage(true);
            } else {
                flightsInArea.get(i).establishImage(false);
                flightsInArea.get(j).establishImage(false);
            }
        }
    }
}

これは、新しいイメージを確立するために使用する方法です。

public void establishImage(boolean conflict) {
    try {
        if (conflict) {
            image = ImageIO.read(this.getClass().getResource("red_plane.png"));
        } else {
            image = ImageIO.read(this.getClass().getResource("blue_plane.png"));
        }
    }
    catch (IOException ex) {
        Logger.getLogger(Vuelo.class.getName()).log(Level.SEVERE, null, ex);
    }
}
4

1 に答える 1

2

あなたのアルゴリズムは健全ではありません。平面 1 と 3 は近くにあるが、平面 2 は両方から離れている 3 つの平面を持つ次の簡単な例を考えてみましょう。あなたのループはこれを行います:

- Check 1 & 2.  Not close, mark both blue
- Check 1 & 3.  Close - mark both red
- Check 2 & 3.  Not close, mark both blue

ここで、最後に、平面 2 と 3 は青でマークされ、平面 1 は赤でマークされますが、平面 3赤でマークされます。これは、アルゴリズムが厳密に反復的であり、赤いマーキングが持続しないためです。考えられる解決策は次のとおりです。

private void checkConflicts(ArrayList<Flight> flightsInArea) {
  HashSet<Integer> redFlights = new HashSet<Integer>();

  // Check for red flights
  for (int i = 0; i < flightsInArea.size(); i++) {
    for (int j = i + 1; j < flightsInArea.size(); j++) {
      Coordinate currentFlight1 = flightsInArea.get(i).getCurrentPosition();
      Coordinate currentFlight2 = flightsInArea.get(j).getCurrentPosition();

      double cathetusX = Math.pow((currentFlight1.getPositionX() - currentFlight2.getPositionX()), 2);
      double cathetusY = Math.pow((currentFlight1.getPositionY() - currentFlight2.getPositionY()), 2);

      double distance = Math.sqrt(cathetusX + cathetusY);

      if (distance < 100) {
        redFlights.add(i);
        redFlights.add(j);
      }
    }
  }

  // Mark flights
  for (int i = 0; i < flightsInArea.size(); i++) {
    flightsInArea.get(i).establishImage(redFlights.contains(i));
  }
}
于 2013-10-13T18:51:03.300 に答える