如何在六边形内生成具有距离的随机位置?
How to generate random positions with distance between them inside the hexagon?
我正在尝试在 500
米六边形内创建 N
给定距离的随机点对 (N = 50)。在 Matlab 中使用 (dmax - dmin).*rand(N,1) + dmin
、dmin = 10
和 dmax = 100
创建的距离 D。我明白首先我必须生成一组点 ([x1 y1])
与主六边形边界至少有 D
的距离,然后生成第二组具有精确距离的点 ([x2 y2])
D
来自第一组。但有时我遇到了六边形外的第二个点的问题,因为如果第一个位置在六边形边界上加上 D
disance,那么第二个位置在六边形之外(我的意思是我想生成随机对位置在 hexagol 内)。有人可以帮我生成这种情况并解决问题吗?谢谢。
例如
R = 500; % hexagol radius
N = 50; % number pair positions
d_min = 10; % minimum distance
d_max = 100; % maximum distance
D = (d_max - d_min).*rand(N,1) + d_min; % randomly distance
X = [0,0]; % hexagol center
j=0;
while j < N
j=j+1;
theta(j)=2*pi*rand(1,1);
u= rand()+ rand();
if u < 1
r(j) = R * u;
else
r(j) = R * (2 - u);
end
% to create the first position
x1(j)=r(j)*cos(theta(j)) + X(1,1); % first x positions
y1(j)=r(j)*sin(theta(j)) + X(1,2); % first y positions
end
% to create the second position
x2(j) = x1(j) + D(j); % second x positions
y2(j) = y1(j) + D(j); % second y positions
这很像您的 ,其解决方案几乎相同,但需要更多数学知识。让我们关注一对点。还有两步:
第 1 步: 在六边形内找到一个随机点,该点距其边界的距离为 d
。
第 2 步: 找到与第一个点的距离为 d
的另一个点。
主要问题是第 1 步。我们可以说,一个距离为d
的点形成一个半径为r
的六边形,实际上在一个半径为r-d
的六边形内。那么我们只需要找到一个位于六边形上的随机点即可!
六边形的极坐标公式:
我想在极地space中解决这个问题,所以我必须在这个space中制定六边形。记住极坐标中的圆公式 space:
极坐标中的六边形公式 space 与其外接圆非常相似,只是六边形的半径在每个 t
(角度)处不同。我们称这个变化的半径为 r2
。因此,如果我们找到 R2
函数 returns r2
对于所有 t
,那么我们可以写出六边形的极坐标公式:
这张图片展示了问题的参数:
这里的关键参数是α
。现在我们需要一个函数 Alpha
对所有 t
s returns α
:
现在我们在极坐标中的六边形边界上有所有点 space:
r = 500;
T = linspace(0, 2*pi, 181);
Alpha = @(t) pi/2-abs(rem(t, pi/3)-(pi/6));
R2 = @(t) r*cos(pi/6)./sin(Alpha(t));
X = R2(T).*cos(T);
Y = R2(T).*sin(T);
hold on
plot(X, Y, '.b');
plot((r).*cos(T), (r).*sin(T), '.r')
正多边形的极坐标公式:
在继续之前,我想概括 Alpha
和 R2
函数以涵盖所有 regular polygons:
Alpha = @(t) pi/2-abs(rem(t, 2*pi/(n))-(pi/(n)));
R2 = @(t) r*cos(pi/n)./sin(Alpha(t));
其中 n
是多边形的边数。
答案:
现在我们可以生成点对,就像我们对圆问题所做的那样:
r = 500; n = 6;
a = 10; b = 50;
N = 100;
D = (b - a).*rand(N,1) + a;
Alpha = @(t) pi/2-abs(rem(t, 2*pi/(n))-(pi/(n)));
R2 = @(t) r*cos(pi/n)./sin(Alpha(t));
T1 = rand(N, 1) * 2 * pi;
RT1 = rand(N, 1) .* (R2(T1)-D);
X1 = RT1.*cos(T1);
Y1 = RT1.*sin(T1);
T2 = rand(N, 1) * 2 * pi;
X2 = X1+D.*cos(T2);
Y2 = Y1+D.*sin(T2);
旋转多边形:
为了旋转多边形,我们只需要更新 Alpha
函数:
t0 = pi/8;
Alpha = @(t) pi/2-abs(rem(t+t0, 2*pi/(n))-(pi/(n)));
这是对 n=7
、N=50000
和 t0=pi/10
的测试:
我正在尝试在 500
米六边形内创建 N
给定距离的随机点对 (N = 50)。在 Matlab 中使用 (dmax - dmin).*rand(N,1) + dmin
、dmin = 10
和 dmax = 100
创建的距离 D。我明白首先我必须生成一组点 ([x1 y1])
与主六边形边界至少有 D
的距离,然后生成第二组具有精确距离的点 ([x2 y2])
D
来自第一组。但有时我遇到了六边形外的第二个点的问题,因为如果第一个位置在六边形边界上加上 D
disance,那么第二个位置在六边形之外(我的意思是我想生成随机对位置在 hexagol 内)。有人可以帮我生成这种情况并解决问题吗?谢谢。
例如
R = 500; % hexagol radius
N = 50; % number pair positions
d_min = 10; % minimum distance
d_max = 100; % maximum distance
D = (d_max - d_min).*rand(N,1) + d_min; % randomly distance
X = [0,0]; % hexagol center
j=0;
while j < N
j=j+1;
theta(j)=2*pi*rand(1,1);
u= rand()+ rand();
if u < 1
r(j) = R * u;
else
r(j) = R * (2 - u);
end
% to create the first position
x1(j)=r(j)*cos(theta(j)) + X(1,1); % first x positions
y1(j)=r(j)*sin(theta(j)) + X(1,2); % first y positions
end
% to create the second position
x2(j) = x1(j) + D(j); % second x positions
y2(j) = y1(j) + D(j); % second y positions
这很像您的
第 1 步: 在六边形内找到一个随机点,该点距其边界的距离为 d
。
第 2 步: 找到与第一个点的距离为 d
的另一个点。
主要问题是第 1 步。我们可以说,一个距离为d
的点形成一个半径为r
的六边形,实际上在一个半径为r-d
的六边形内。那么我们只需要找到一个位于六边形上的随机点即可!
六边形的极坐标公式:
我想在极地space中解决这个问题,所以我必须在这个space中制定六边形。记住极坐标中的圆公式 space:
极坐标中的六边形公式 space 与其外接圆非常相似,只是六边形的半径在每个 t
(角度)处不同。我们称这个变化的半径为 r2
。因此,如果我们找到 R2
函数 returns r2
对于所有 t
,那么我们可以写出六边形的极坐标公式:
这张图片展示了问题的参数:
这里的关键参数是α
。现在我们需要一个函数 Alpha
对所有 t
s returns α
:
现在我们在极坐标中的六边形边界上有所有点 space:
r = 500;
T = linspace(0, 2*pi, 181);
Alpha = @(t) pi/2-abs(rem(t, pi/3)-(pi/6));
R2 = @(t) r*cos(pi/6)./sin(Alpha(t));
X = R2(T).*cos(T);
Y = R2(T).*sin(T);
hold on
plot(X, Y, '.b');
plot((r).*cos(T), (r).*sin(T), '.r')
正多边形的极坐标公式:
在继续之前,我想概括 Alpha
和 R2
函数以涵盖所有 regular polygons:
Alpha = @(t) pi/2-abs(rem(t, 2*pi/(n))-(pi/(n)));
R2 = @(t) r*cos(pi/n)./sin(Alpha(t));
其中 n
是多边形的边数。
答案:
现在我们可以生成点对,就像我们对圆问题所做的那样:
r = 500; n = 6;
a = 10; b = 50;
N = 100;
D = (b - a).*rand(N,1) + a;
Alpha = @(t) pi/2-abs(rem(t, 2*pi/(n))-(pi/(n)));
R2 = @(t) r*cos(pi/n)./sin(Alpha(t));
T1 = rand(N, 1) * 2 * pi;
RT1 = rand(N, 1) .* (R2(T1)-D);
X1 = RT1.*cos(T1);
Y1 = RT1.*sin(T1);
T2 = rand(N, 1) * 2 * pi;
X2 = X1+D.*cos(T2);
Y2 = Y1+D.*sin(T2);
旋转多边形:
为了旋转多边形,我们只需要更新 Alpha
函数:
t0 = pi/8;
Alpha = @(t) pi/2-abs(rem(t+t0, 2*pi/(n))-(pi/(n)));
这是对 n=7
、N=50000
和 t0=pi/10
的测试: