align the random number in straight line that will restrict in the box dimension
3 次查看(过去 30 天)
显示 更早的评论
N=40;
phi=0.6;
% Dimension of the box
L=15;
% Diameter of particles
d=sqrt(4*phi*L^2/(pi*N));
a=d/2;
% Perturbation
epsilon=[0.0001];
for run=1:1
for i=1:N
% place particle i randomly
% x position will be randomly from -7.5 to 7.5
X0in(2*i-1)=L*(rand(1)-1/2);
% y position will be randomly from -7.5 to 7.5
X0in(2*i)=L*(rand(1)-1/2);
end
end
I want to generate 40 different positions in the square box from -7.5 to 7.5 for both x and y direction. Because it has higher area fraction with larger number of position (40), hence it is so hard for Matlab to give me the result without overlapping. I want to generate and put them in a straight line order from -7.5 to 7.5 then move a little bit if they overlap. But I dont know how to put the random number that aligns in the straight line in this box ( dont matter if they overlap or not). Note: I will draw circle for each X-Y position with diameter d.
Any helps would be nice. Thanks
1 个评论
Walter Roberson
2013-3-8
A straight line along which axis? Are you referring to sort() ?
Question: why are you not using
X0in = L * (rand(2*N) - 1/2);
采纳的回答
Image Analyst
2013-3-8
编辑:Image Analyst
2013-3-8
Phong: Try this code where I compare distances of the point to all other points before I decide whether or not to accept it:
clc;
maxNumberOfParticles = 20;
phi=0.6;
% Dimension of the box
L=15;
tic;
% Diameter of particles
particleDiameter = sqrt(4*phi*L^2/(pi*maxNumberOfParticles));
particleRadius = particleDiameter / 2;
% Perturbation
epsilon=[0.0001];
numberOfRuns = 1;
p = 1; % Particle counter/index.
for run = 1 : numberOfRuns
while p <= maxNumberOfParticles % Keep going until we have all the particle.
% Place particle p randomly
% x position will be randomly from -7.5 to 7.5
trialX = L*(rand(1)-1/2);
% y position will be randomly from -7.5 to 7.5
trialY = L*(rand(1)-1/2);
if p > 1
% Calculate distances from the trial point to all other points.
distances = sqrt((trialX - x).^2 + (trialY - y).^2);
% Find the minimum distance to any other particle.
[minDistance, minIndex] = min(distances);
% Assign this one if it's not closer to any otehr particle than particleRadius.
if minDistance > particleRadius
x(p) = trialX;
y(p) = trialY;
% Print out coordinates of the particle that is "Too close"
% just for fun/informational purposes.
fprintf('Accepting trial particle #%d located at (%.3f, %.3f)\n',...
p, trialX, trialY);
p = p + 1;
else
% Print out coordinates of the particle that is "Too close"
% just for fun/informational purposes.
fprintf('Skipping trial particle #%d located at (%.3f, %.3f) because it is too close to particle %d at (%.3f, %.3f)\n',...
p, trialX, trialY, minIndex, x(minIndex), y(minIndex));
end
else
% This is the first particle, so just take it.
x(p) = trialX;
y(p) = trialY;
p = p + 1;
end
end
end
toc;
Output in command window:
Accepting trial particle #2 located at (-0.886, 6.843)
Accepting trial particle #3 located at (4.781, 3.424)
Accepting trial particle #4 located at (-4.863, -2.094)
Skipping trial particle #4 located at (-4.668, -7.482) because it is too close to particle 11 at (-4.892, -7.108)
Skipping trial particle #4 located at (-2.754, 2.994) because it is too close to particle 22 at (-3.464, 3.735)
Skipping trial particle #4 located at (1.879, 0.646) because it is too close to particle 31 at (2.195, 0.318)
Accepting trial particle #5 located at (-0.914, -3.189)
Skipping trial particle #5 located at (0.025, 3.923) because it is too close to particle 8 at (-0.074, 3.096)
Accepting trial particle #6 located at (3.936, 1.141)
etc.....
Accepting trial particle #36 located at (-5.493, 2.572)
Skipping trial particle #36 located at (1.065, -4.953) because it is too close to particle 12 at (1.224, -5.758)
Skipping trial particle #36 located at (-5.285, -0.359) because it is too close to particle 6 at (-5.652, 0.066)
Accepting trial particle #37 located at (6.122, 0.783)
Accepting trial particle #38 located at (-7.006, -6.692)
Skipping trial particle #38 located at (4.576, -0.729) because it is too close to particle 20 at (5.196, 0.090)
Accepting trial particle #39 located at (-1.760, 4.345)
Accepting trial particle #40 located at (-2.036, 0.485)
Elapsed time is 0.007953 seconds.
2 个评论
Image Analyst
2013-3-8
编辑:Image Analyst
2013-3-8
The line should have said:
while p <= maxNumberOfParticles
I fixed it. I don't know why you say there is still overlap - I don't see how that could be true. Thanks for marking it Accepted.
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!