java—在模拟引擎中对节点之间的交互进行建模时,有没有降低复杂性的方法?

7jmck4yq  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(365)

我正在用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
      }

   }
}

正如你所看到的,这给了指数级的复杂性——这是模拟中必须采用的方式,还是我错过了更好的方式?
任何帮助都将不胜感激!!!

zvms9eto

zvms9eto1#

如果两个人只要相距远于某个距离d,就不进行互动,那么你可以把你的世界分成大小为d×d的正方形。然后你只需要在同一个或相邻的方格里把每个人和其他人核对一下。
在java中,您可以使用 Hashmap<java.awt.Point, List<Person>> 跟踪每个广场上的人。

相关问题