我正在用javaw/javafxui构建一个仿真。
我的想法是我可以创建许多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
}
}
}
正如你所看到的,这给了指数级的复杂性——这是模拟中必须采用的方式,还是我错过了更好的方式?
任何帮助都将不胜感激!!!
1条答案
按热度按时间zvms9eto1#
如果两个人只要相距远于某个距离d,就不进行互动,那么你可以把你的世界分成大小为d×d的正方形。然后你只需要在同一个或相邻的方格里把每个人和其他人核对一下。
在java中,您可以使用
Hashmap<java.awt.Point, List<Person>>
跟踪每个广场上的人。