通过区块划分提高随机生成圆球干涉检查的效率
在材料研究中,经常使用Matlab来仿真材料的各种情况——比如仿真电池颗粒的分布及后续计算。
在材料仿真时,我们第一步一般是先生成要仿真的材料。而其中用到的方法之一就是随机位置生成一定数量特定大小的颗粒。例如下图的样子:
在随机生成这些颗粒的时候,每随机生成一个颗粒我们都要判断新生成的颗粒和其它已有颗粒的位置关系,如果发生干涉则新生成的颗粒需要重新生成。而这样的计算方式的时间复杂度是O(N!)的,随着要生成的颗粒的数量的增加计算时间将变得漫长。
为了提高计算的效率,我们在对新生成颗粒和已有颗粒的干涉判断上,可以采用区块划分的方式。即把空间分割为若干个区块,每次新生成的颗粒都只和若干个区块内的已有颗粒进行干涉判断,通过这种方式,将计算量减小。
在下图中,我们将生成空间划为了10x10个区块。每次生成一个新的颗粒,我们不再把新颗粒和所有已有的颗粒进行干涉检查,而是只对新颗粒所在的区块以及周围的八个区块内的已有颗粒进行干涉检查。当我们的颗粒生成是完全随机的,那么我们的干涉计算量只为原本方式的9/100。
在区块法的情况下,无论总的区块是多少,我们都只需要对9个区块进行判断。所以,当我们把空间划为x个区块时,效率为原始效率的x/9。但是,需要注意的是,区块不能无限增多,因为我们必须保证区块能够容纳最大的颗粒,否则计算将出现问题。
通过这种方式,我们可以快速的随机生成各种不同大小特定数量的颗粒。