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

21 次查看(过去 30 天)
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

采纳的回答

Image Analyst
Image Analyst 2014-10-12
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 个评论
Image Analyst
Image Analyst 2022-4-27
@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 2022-7-1
@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

请先登录,再进行评论。

更多回答(2 个)

SS
SS 2014-11-1
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 个评论
Image Analyst
Image Analyst 2014-11-1
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.

请先登录,再进行评论。


SS
SS 2014-11-1
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 个评论
Image Analyst
Image Analyst 2014-11-1
编辑:Image Analyst 2014-11-1
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 2014-11-2
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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Particle & Nuclear Physics 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by