Create random points in a rectangular domain, but with minimum separation distance

28 vues (au cours des 30 derniers jours)
Hello,
I am not a regular user of this program. Hence this query.
I am interested to create random points in a 2D rectangular space, to start with, a uniform distribution. I know how to do this. However, I want to ensure that each of these points are separated by a certain minimum distance.
Can anyone help me with the script please.
Thank you.
Suresh

Réponse acceptée

Image Analyst
Image Analyst le 12 Oct 2014
You basically have to try and see. If it's too close, reject that point and get a new one.
x = rand(1, 10000);
y = rand(1, 10000);
minAllowableDistance = 0.05;
numberOfPoints = 300;
% Initialize first point.
keeperX = x(1);
keeperY = y(1);
% Try dropping down more points.
counter = 2;
for k = 2 : numberOfPoints
% Get a trial point.
thisX = x(k);
thisY = y(k);
% See how far is is away from existing keeper points.
distances = sqrt((thisX-keeperX).^2 + (thisY - keeperY).^2);
minDistance = min(distances);
if minDistance >= minAllowableDistance
keeperX(counter) = thisX;
keeperY(counter) = thisY;
counter = counter + 1;
end
end
plot(keeperX, keeperY, 'b*');
grid on;
  7 commentaires
Image Analyst
Image Analyst le 27 Avr 2022
@William Harvie, please post a more efficient way to do it if you know of one.
%============================================================================================================================================
% Initialization Steps.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 25;
% Get a list of trial (x,y) circle centers.
x = 100 * rand(1, 1000000);
y = 100 * rand(1, 1000000);
% Specify how many circles are desired.
numberOfCircles = 300;
minRadius = 1;
maxRadius = 5;
% Specify how close the centers may be to each other.
% Should be at least twice the max radius if they are not to touch.
minAllowableDistance = max([11, 2 * maxRadius]);
% Initialize first point.
keeperX = x(1);
keeperY = y(1);
radii = minRadius;
% Try dropping down more points.
counter = 2;
for k = 2 : length(x)
% Get a trial point.
thisX = x(k);
thisY = y(k);
% See how far is is away from existing keeper points.
distances = sqrt((thisX-keeperX).^2 + (thisY - keeperY).^2);
minDistance = min(distances);
if minDistance >= minAllowableDistance
% This trial location works. Save it.
keeperX(counter) = thisX;
keeperY(counter) = thisY;
% Get a random radius.
radii(counter) = minRadius + (maxRadius - minRadius) * rand;
% Quit if we have enough or ran out of circles to try
if counter >= numberOfCircles
break;
end
counter = counter + 1;
end
end
% Plot a dot at the centers
plot(keeperX, keeperY, 'b+', 'MarkerSize', 9);
viscircles([keeperX(:), keeperY(:)], radii, 'Color', 'b');
grid on;
axis equal
numCirclesPlaced = length(keeperX);
caption = sprintf('Could place %d circles', numCirclesPlaced);
title(caption, 'fontSize', fontSize)
g = gcf;
g.WindowState = 'maximized'
Joan
Joan le 1 Juil 2022
@Image Analyst, thank you very much for your code. It is showing me some direction. However, I am a bit stuck. Please add some code that would make the circles enclosed inside a polyshape of coordinates say,
xv=[0 0 20 35 66 85 105 105]; % X-Coordinates
yv=[0 20 20 40 40 20 16 0]; % Y-Coordinates

Connectez-vous pour commenter.

Plus de réponses (2)

SS
SS le 1 Nov 2014
Hi,
If I may bother you once again please. I am looking to generate random ellipsoids in a cube, given the volume fraction of ellipsoids (say 40%), non-overlapping (can touch), and they must follow certain particle size distribution. One instance could be, 60% of 2mm, 20% of 4 mm, 15% of 8 mm and 5% of size 16 mm. These sizes (2mm, 4 mm...) are the lengths of the largest semi-principal axes.
Thank you for your time.
S
  1 commentaire
Image Analyst
Image Analyst le 1 Nov 2014
I suggest you post this in a brand new question. But try the ellipsoid function first using the "try and keep/reject" concept. If you can't get it working, post your code in a new question since it's a different topic than this one.

Connectez-vous pour commenter.


SS
SS le 1 Nov 2014
Hi,
Thank you, I have posted it as a separate question. Thank you for the hint, in the meantime, I am also trying.
S
  2 commentaires
Image Analyst
Image Analyst le 1 Nov 2014
Modifié(e) : Image Analyst le 1 Nov 2014
Yeah but I see you didn't take my advice, so expect a lot of questions like "Do the axes of the ellipsoids have to align with the xyz axes?", "What have you tried?", "Have you seen the ellipsoid function?", "Is this a homework problem?", and so on.
SS
SS le 2 Nov 2014
Hi,
I take your point. Once I formulate the code, I will put it up in the discussions. The idea for posting in advance was to know if someone has already done it.
There should be six degrees of freedom (three rotations and three axes). Indeed I was looking at ellipsoid function, where in I use random function for all the six variables. I am figuring out the best way to determine minimum distance, placing the particles, etc. not yet there. It is not a homework problem, but needed for a small element of my own research work.
Thanks again. S

Connectez-vous pour commenter.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by