我需要放给定半径的球体在卷中随机,没有任何球体重叠。
如果我选择让所有球体占据总体积的约 57% 的值,我发现很难得到结果。放置的基本方案- 之后的第一个粒子粒子已放置:
- 选择随机位置
- 检查与任何其他球体的重叠
- if(overlap): 检查新随机选择的位置
- 重复直到已放置
- 放置下一个粒子
但是,放置的粒子越多,我的随机发生器就越不可能找到有足够空间的位置,并且重叠检查需要的时间就越多。为了,,该算法勉强能够放置340个粒子(此时重叠称为数十亿次)。
C++ 代码:
using namespace std;
//this function places N hard spheres of radius R on random coordinates in a [-0.5,0.5]^3 box
vector <particle> random_positions_hard_spheres (int N, double R){
vector <particle> positions;
static seed_seq seed_sequence { 100, 78639, 193, 55555, 3, 2348089, 6474367, 264441578 };
static mt19937 gen (seed_sequence);
uniform_real_distribution<double> random_double(-0.5, 0.5);
double x,y,z;
double d=2*R;
for(size_t i=0; i<N; ++i){
x=random_double(gen);
y=random_double(gen);
z=random_double(gen);
positions.push_back({x,y,z});
//find position with no overlap
int j=0;
while(overlap_index(positions, i, d)){
positions[i]={random_double(gen), random_double(gen), random_double(gen)};
++j;
}
cout <<"overlap was called "+to_string(j)+" times"<<endl;
cout <<"particle "+to_string(i)+" was placed"<<endl;
}
return positions;
}
重叠函数检查粒子是否与任何先前放置的粒子重叠。