我正在尝试在from common_folder.class import MyClass
米六边形内创建给定距离的N
个随机点对(N = 50)。在Matlab中使用500
,(dmax - dmin).*rand(N,1) + dmin
和dmin = 10
创建的距离D.我明白第一个我必须生成一组点dmax = 100
,它们与主六边形边界至少有距离([x1 y1])
,然后生成具有精确距离的第二组点D
第一组([x2 y2])
。但是有时候我得到六边形之外的第二个点的问题,因为如果六边形边框上的第一个位置加上D
disance,那么第二个位置在六边形之外(我的意思是我想生成随机对六角形内部的位置)。任何人都可以帮助我生成这种情况并解决问题吗?感谢。
例如
D
答案 0 :(得分:1)
这很像你的other question,它的解决方案几乎相同,但它需要更多的数学。让我们关注一对点。仍然有两个步骤:
第1步:找到六边形内的随机点,距其边界距离为d
。
第2步:找到距离第一个点有d
距离的另一个点。
主要问题是第1步。我们可以说距离d
形成半径为r
的六边形的点实际上位于半径为r-d
的六边形内。然后我们只需要找到一个六边形的随机点!
六边形极坐标:
我想在极地空间解决这个问题,所以我必须在这个空间中制定六边形。记住极地空间中的圆形公式:
极地空间中的六边形公式与其外接圆非常相似,只是六边形的半径在每t
(角度)不同。让我们称这个变化半径为r2
。因此,如果我们找到为所有R2
返回r2
的函数t
,那么我们可以为六边形编写极坐标公式:
此图片演示了问题的参数:
此处的关键参数是α
。现在我们需要一个函数Alpha
,它会为所有α
返回t
:
现在我们在极地空间的六角形边界上有所有点:
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
的测试: