Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据情况更改图像_Java_Swing_Jpanel_Graphics2d - Fatal编程技术网

Java 根据情况更改图像

Java 根据情况更改图像,java,swing,jpanel,graphics2d,Java,Swing,Jpanel,Graphics2d,我在做一个班级项目,这是一个飞行雷达模拟器 情况是,当两架飞机危险地靠近时,两架飞机的图像都会改变,当它们在安全距离内时,它们会再次改变 问题是,大多数情况下,这些图像中只有一个变为红色,我不知道问题出在哪里 这是我用来检查接近情况的方法,非常简单,只检查它们之间的距离。 private void checkConflicts(ArrayList<Flight> flightsInArea) { for (int i = 0; i < flightsInArea.

我在做一个班级项目,这是一个飞行雷达模拟器

情况是,当两架飞机危险地靠近时,两架飞机的图像都会改变,当它们在安全距离内时,它们会再次改变

问题是,大多数情况下,这些图像中只有一个变为红色,我不知道问题出在哪里

这是我用来检查接近情况的方法,非常简单,只检查它们之间的距离。

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

你的算法不正确。考虑以下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));
  }
}
专用无效检查冲突(ArrayList flightsInArea){
HashSet redFlights=新HashSet();
//检查红色航班
对于(int i=0;i
不会解决您的问题,但您不应该每次检查时都从桌子上读取图像。当你启动你的程序时,图像应该被读入内存。谢谢,我会听从你的建议。见表1+。或者,他可以在循环前将所有航班变为蓝色,如果关闭,则在没有else条款的情况下变为红色。谢谢你的回答。你帮了我很多。
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));
  }
}