【问题标题】:How to generate random positions with distance between them inside the hexagon?如何在六边形内生成具有它们之间距离的随机位置?
【发布时间】:2016-07-17 15:39:15
【问题描述】:

我正在尝试在500 米六边形内创建给定距离的N 随机点对(N = 50)。使用(dmax - dmin).*rand(N,1) + dmin创建的距离D,在Matlab中使用dmin = 10dmax = 100。我知道第一个我必须生成一组点([x1 y1]),它们与主六边形边框的距离至少为D,然后生成第二组点([x2 y2]),与第一个点有精确的距离D放。但有时我在六边形之外遇到了第二个点的问题,因为如果在六边形边框上的第一个位置加上Ddisance,那么第二个位置在六边形之外(我的意思是我想在里面生成随机对位置六醇)。有人可以帮助我生成这种场景并解决问题吗?谢谢。

例如

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

【问题讨论】:

    标签: matlab math geometry polygon


    【解决方案1】:

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

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

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

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

    六边形的极性公式:

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

    六边形在极地空间的公式很像它的外接圆,只是六边形的半径在每个t(角度)处都不同。我们把这个变化的半径称为r2。因此,如果我们找到函数R2 为所有ts 返回r2,那么我们可以写出六边形的极坐标公式:

    此图演示了问题的参数:

    这里的关键参数是α。现在我们需要一个函数Alpha,它为所有ts返回α

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

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

    正多边形的极坐标公式:

    在继续之前,我想概括一下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 是多边形的边数。

    答案:

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

    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=7N=50000t0=pi/10 的测试:

    【讨论】:

    • 我理解你的想法,非常感谢。我很快就会发布我的源代码,当然和你有点不同。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多