2013-10-13 32 views
1

我正在研究班级项目,这是一个飞行雷达模拟器。根据情况更改图片

情况是,当两架飞机危险地关闭两个航班的图像变化,当他们在安全的距离,他们再次改变。

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

不会解决你的问题,但你不应该每次检查时都从桌面读取图像。启动程序时应将图像读入内存。 – camickr

+0

谢谢,我会按照你的意见。 – sandiego

+0

[“飞机使用稍微修改版本的极坐标进行导航,”](http://en.wikipedia.org/wiki/Polar_coordinate_system#Position_and_navigation)见[这里](http://stackoverflow.com/a/12607586)/230513)。 – trashgod

回答

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

1+。或者他可以在循环之前将所有航班变为蓝色,并且如果在没有else子句的情况下关闭,则变为红色。 –

+0

感谢您的回答。你帮了我很多。 – sandiego