问题描述
我正在使用带有JavaFX UI的Java构建仿真。
这个想法是,我可以创建许多Person对象(在一个数组中),其中将包含(x,y)坐标以表示要在屏幕上呈现的位置。在每个时间步骤中,我都会遍历数组并将一些对象应用于Person对象以计算其下一个位置(基于当前速度等)。到目前为止一切顺利...
但是,我还想对Person对象之间的交互进行建模(确保它们例如不会重叠,并且只会彼此反弹)。我能看到的唯一方法是遍历每个人的数组,以将其x,y值与其他人进行比较,例如
Person [] population = initialisePopulationArray(); //Helper function to just set initial values
//A step in time occurs just before I render the new positions on screen
void step(){
//Do basic initial calculation on positions O(n)
for(Person person: population){
updatePosition(person); //Based on trajectory etc
}
//Determine if new positions mean that people are overlapping and resolve O(n ^ 2)
for(int i=0; i<population.length; i++){ //For every person
Person person = population[i];
for(int x=i+1; i<population.length-(i+1); i++){ //Compare against every other person
compareAndResolve(person,population[x]; // Some function to compare and resolve any issues
}
}
}
如您所见,这带来了指数级的复杂性-这只是在这样的模拟中必须采用的方式,还是我错过了更好的方式?
任何帮助将不胜感激!!!
解决方法
如果两个人只要不离开某个距离( d )就不会互动,那么您可以将您的世界划分为大小为 d x d 的正方形。然后,您只需要检查每个人是否与其他人位于相同或相邻的正方形中即可。
在Java中,您可以使用Hashmap<java.awt.Point,List<Person>>
来跟踪每个广场上的人。