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

你的算法不健全。考虑以下具有 3 个平面的简单示例,其中平面 1 和 3 靠近,但平面 2 远离它们。你的循环这样做:

- 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 回答