如何在六边形内部生成具有距离的随机位置?

时间:2016-07-17 15:39:16

标签: matlab math geometry polygon

我正在尝试在from common_folder.class import MyClass 米六边形内创建给定距离的N个随机点对(N = 50)。在Matlab中使用500(dmax - dmin).*rand(N,1) + dmindmin = 10创建的距离D.我明白第一个我必须生成一组点dmax = 100,它们与主六边形边界至少有距离([x1 y1]),然后生成具有精确距离的第二组点D第一组([x2 y2])。但是有时候我得到六边形之外的第二个点的问题,因为如果六边形边框上的第一个位置加上D disance,那么第二个位置在六边形之外(我的意思是我想生成随机对六角形内部的位置)。任何人都可以帮助我生成这种情况并解决问题吗?感谢。

例如

D

1 个答案:

答案 0 :(得分:1)

这很像你的other question,它的解决方案几乎相同,但它需要更多的数学。让我们关注一对点。仍然有两个步骤:

第1步:找到六边形内的随机点,距其边界距离为d

第2步:找到距离第一个点有d距离的另一个点。

主要问题是第1步。我们可以说距离d形成半径为r的六边形的点实际上位于半径为r-d的六边形内。然后我们只需要找到一个六边形的随机点!

六边形极坐标:

我想在极地空间解决这个问题,所以我必须在这个空间中制定六边形。记住极地空间中的圆形公式:

enter image description here

极地空间中的六边形公式与其外接圆非常相似,只是六边形的半径在每t(角度)不同。让我们称这个变化半径为r2。因此,如果我们找到为所有R2返回r2的函数t,那么我们可以为六边形编写极坐标公式:

enter image description here

此图片演示了问题的参数:

**Image**

此处的关键参数是α。现在我们需要一个函数Alpha,它会为所有α返回t

enter image description here

现在我们在极地空间的六角形边界上有所有点:

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')

**image**

正多边形的极坐标公式:

在我继续之前,我想概括AlphaR2函数来涵盖所有regular polygons

Alpha = @(t) pi/2-abs(rem(t, 2*pi/(n))-(pi/(n)));
R2 = @(t) r*cos(pi/n)./sin(Alpha(t));

其中n是多边形的边数。

**image**

<强>答案:

现在我们可以生成一对点,就像我们对圆圈问题所做的那样:

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);

enter image description here

旋转多边形:

要旋转多边形,我们只需要更新Alpha函数:

t0 = pi/8;
Alpha = @(t) pi/2-abs(rem(t+t0, 2*pi/(n))-(pi/(n)));

这是对n=7N=50000t0=pi/10的测试:

![**image**