我正在研究一个班级项目,它是一个飞行雷达模拟器。
情况是,当两架飞机危险地关闭时,两架飞机的图像都会发生变化,当它们处于安全距离时,它们会再次发生变化。
问题在于,大部分时间只有其中一个图像变为红色,我不知道问题出在哪里。
这是我用来检查紧密度条件的方法,非常简单,只检查它们之间的距离。
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);
}
}
答案 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));
}
}