根据情况改变图像

时间:2013-10-13 18:38:23

标签: java swing jpanel graphics2d

我正在研究一个班级项目,它是一个飞行雷达模拟器。

情况是,当两架飞机危险地关闭时,两架飞机的图像都会发生变化,当它们处于安全距离时,它们会再次发生变化。

Radar

问题在于,大部分时间只有其中一个图像变为红色,我不知道问题出在哪里。

这是我用来检查紧密度条件的方法,非常简单,只检查它们之间的距离。

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);
    }
}

1 个答案:

答案 0 :(得分: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&amp; 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));
  }
}