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