Improve algorithm to fill a rectangle with given number of points
Show older comments
I have a working code but it´s taking too long if I change some of the parameters. The goal is to fill a rectangle of given size with a given number of points (NumLigands) and a distance restraint between them (LigSpace). Here it is:
tic
W = 200 ; % Angstrom
H = 200 ; % Angstrom
dx = 1 ; % Resolution in x axis
dy = 1 ; % Resolution in y axis
X = [0:dx:W]' ; % Set of coordinates in x axis
Y = [0:dy:H]' ; % Set of positions in y axis
Area = W*H/10^2 ; % in nm2
density = 2.67 ; % #/nm2
NumLigands = density * Area ;
LigSpace = 7.11 ; % Ligand spacing
keepP(1,:) = [randsample(X,1) ; randsample(Y,1)]' ; % Fix this point
add = 2 ;
while add <= NumLigands
newP = [randsample(X,1) ; randsample(Y,1)]' ; % try a new point
%Calculate distance to other points
Distance = sqrt( (newP(1,1) - keepP(:,1)).^2 + (newP(1,2) - keepP(:,2)).^2 ) ;
minDistance = min(Distance) ;
if minDistance > normrnd(LigSpace,1)
keepP(add,:) = newP ;
figure(1);plot(keepP(add,1),keepP(add,2),'g*')
xlim = [0 200];
ylim = [0 200];
hold on
add = add + 1 ;
end
end
toc
With these parameters it takes about 2 min in my computer, which is not too bad, but if I change something like increasing the number of points or reducing the distance constraint it can take up to 10 minutes or more.
I want to keep the positioning of ligands randomly, but is there an heuristic I could use to reduce the computation time? Thanks!
2 Comments
What's the density of points? I wonder if one were to start with array at the allowed spacing (with a random offset by row/column initially so aren't exactly uniform) and then, instead of generating N, randomly purge M, leaving N? You'd start of with the constraint being satisfied.
Just a thought, not sure how well it might suit needs...
Eugenio Gil
on 20 Aug 2018
Accepted Answer
More Answers (0)
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!