在Matlab中模拟不能相互碰撞的随机游走者

时间:2017-05-24 09:25:21

标签: matlab random collision-detection simulation

我编写了一个代码来模拟二维盒子中圆形粒子的运动。每当他们从包装盒中移出时,我都将它们放在盒子内并靠近墙壁。我想在代码中添加粒子的直径(2R),这意味着当两个圆的中心之间的距离变得小于2R时,它们沿着连接它们的中心的线分开,使得圆的中心之间的距离变为等于2R。

有人建议使用代码来防止粒子重叠吗?

这是我的代码,不考虑重叠:

clear all
close all
l = 224; nn = 800; %number of particles
time = 1000; dd = 1;
x= l*rand(1,nn);
y= l*rand(1,nn);

for t = 1:time;
x= x + rand(1,nn)-0.5* ones(1,nn);
y=y+rand(1,nn)-0.5* ones (1,nn);
index = (x < 0); x(index) = abs(normrnd(0,1,1,nnz(index)));
index = (y < 0); y(index) = abs(normrnd(0,1,1,nnz(index)));
index = (x > l); x(index) = l-abs(normrnd(0,1,1,nnz(index)));
index = (y > l); y(index) = l-abs(normrnd(0,1,1,nnz(index)));
end

1 个答案:

答案 0 :(得分:2)

以下是一些注释代码,可以执行您想要的操作。值得注意的是:

  • ;是用于交互的一些定义的粒度。
  • 使用psize找到的点对点距离。
  • 太近的点会相互移开一定量(pdist2倍于当前距离,如果dp则x和y距离加倍,直到没有碰撞。

有关详细信息,请参阅评论。

dp=1/2

结果:

random walk

编辑:

为了获得更清晰的图表,您可以初始化一些颜色矩阵clear; close all; l = 224; nn = 800; % number of particles time = 100; x = l*rand(1,nn); y = l*rand(1,nn); psize = 2; % Particle size for interaction dp = 0.1; figure; hold on; axis([0 l 0 l]); for t = 1:time; % Random movement movement = 2*rand(2,nn)-1; x = x + movement(1,:); y = y + movement(2,:); index = (x < 0); x(index) = abs(normrnd(0,1,1,nnz(index))); index = (y < 0); y(index) = abs(normrnd(0,1,1,nnz(index))); index = (x > l); x(index) = l-abs(normrnd(0,1,1,nnz(index))); index = (y > l); y(index) = l-abs(normrnd(0,1,1,nnz(index))); % Particle interaction. Loop until there are no clashes. For % robustness, some max iteration counter should be added! numclash = 1; while numclash > 0 dists = pdist2([x;y]', [x;y]'); % Distances between all particles dists(dists < psize) = NaN; % Those too close are assigned NaN tooclose = isnan(tril(dists,-1)); % All NaNs identified by logical [clash1,clash2] = find(tooclose); % Get particles which are clashing numclash = numel(clash1); % Get number of clashes % All points where there was a clash, move away from each other x(clash1) = x(clash1) + (x(clash1)-x(clash2))*dp; x(clash2) = x(clash2) - (x(clash1)-x(clash2))*dp; y(clash1) = y(clash1) + (y(clash1)-y(clash2))*dp; y(clash2) = y(clash2) - (y(clash1)-y(clash2))*dp; end % Plot to visualise results. Colour fade from dark to bright green over time scatter(x,y,'.','markeredgecolor',[0.1,t/time,0.4]); drawnow; end hold off 并使用

进行绘图
C = rand(nn,3);

这会给每个粒子提供不同的颜色,从黑暗到光线也会逐渐消失,而不是像以前一样从暗到淡。结果将是这样的:

colours