如何生成它们之间距离的随机位置?

时间:2016-07-16 21:07:19

标签: matlab math geometry

假设我有一个带有6个距离元素的向量

D = [10.5 44.8 30.01 37.2 23.4 49.1].

我正在尝试在200米的圆圈内创建给定距离的随机对位置。请注意,在Matlab中使用(b - a).*rand(6,1) + a创建距离D,a = 10b = 50。我不知道如何在给定距离的情况下生成随机对。

有人可以帮助我制作这种情景吗?

2 个答案:

答案 0 :(得分:0)

您可以使用两步法解决问题。你可以

  1. 随机生成第一个点然后您可以考虑中心是该点的圆,其半径是D
  2. 中的距离
  3. 一旦你绘制了圆圈,那个圆圈上的每一个点都会与之前创建的第一个点之间的距离D,并且通过随机选择其中一个候选你将获得第二个点
  4. 让我们看一个例子:假设您圈子的半径为200,其中心为(0,0),所以我们首先声明一些主要变量。

    MAINCENTER_x=0;
    MAINCENTER_y=0;
    MAINRADIUS=200;
    

    现在让我们考虑第一个距离,D(1)=10.5,我们现在生成第一个随机点(连同它的配对点 - 我估计你不希望一个点在里面而另一个点在主圈之外)必须位于主圈内

    r=D(1); % let's concentrate on the first distance
    while true
        x=((MAINRADIUS-2*r) - (-MAINRADIUS+2*r))*rand(1,1) + (-MAINRADIUS+2*r);
        y=((MAINRADIUS-2*r) - (-MAINRADIUS+2*r))*rand(1,1) + (-MAINRADIUS+2*r);
        if x^2+y^2<=(MAINRADIUS-2*r)^2
            break;
        end
    end
    

    在此循环结束时xy将是我们的第一个点坐标。

    现在我们将生成它的所有邻居,因此几个候选者成为该对中的第二个点。如前所述,这些候选人将是位于中心为(x,y)且半径为D(1)=10.5的圆上的点。我们可以按如下方式创建这些候选人:

    % declare angular spacing
    ang=0:0.01:2*pi; 
    % build neighbour points
    xp=r*cos(ang)+x;
    yp=r*sin(ang)+y;
    

    现在xpyp是两个向量,分别包含我们候选人的x坐标和y坐标,因此我们现在将随机选择其中一个

    % second point
    idx=randsample(1:length(xp),1);
    secondPoint_x=xp(idx);
    secondPoint_y=yp(idx);
    

    最后,对(x,y)是第一个点,而(secondPoint_x, secondPoint_y)对是我们的第二个点。以下图表有助于总结这些步骤: enter image description here 红色圆圈是主要区域(中心位于(0,0)和半径200),红色星号是第一个点(x,y),蓝色小圆圈的中心为(x,y),半径为10.5最后,黑色星号是对(secondPoint_x, secondPoint_y)中的第二个点,在蓝色小圆圈中的候选者中随机抽取。

    您当然可以对D中的所有元素重复相同的过程,或者依赖于以下代码,这些代码完全相同,而不会遍历D中的所有元素。

    MAINCENTER_x=0;
    MAINCENTER_y=0;
    MAINRADIUS=200;
    
    D = [10.5 44.8 30.01 37.2 23.4 49.1];
    
    % generate random point coordinates
    while true
        x=((MAINRADIUS-2*D) - (-MAINRADIUS+2*D)).*rand(1,6) + (-MAINRADIUS+2*D);
        y=((MAINRADIUS-2*D) - (-MAINRADIUS+2*D)).*rand(1,6) + (-MAINRADIUS+2*D);
        if all(x.^2+y.^2<=(MAINRADIUS-2*D).^2)
            break;
        end
    end
    
    % declare angular spacing
    ang=0:0.01:2*pi; 
    % build neighbour points
    xp=bsxfun(@plus, (D'*cos(ang)),x');
    yp=bsxfun(@plus, (D'*sin(ang)),y');
    
    % second points
    idx=randsample(1:size(xp,2),length(D));
    secondPoint_x=diag(xp(1:length(D),idx));
    secondPoint_y=diag(yp(1:length(D),idx));
    %plot
    figure(1);
    plot(MAINRADIUS*cos(ang)+MAINCENTER_x,MAINRADIUS*sin(ang)+MAINCENTER_y,'r'); %main circle
    hold on; plot(xp',yp');                          % neighbours circles
    hold on; plot(x,y,'r*');                         % first points (red asterisks)
    hold on; plot(secondPoint_x,secondPoint_y,'k*'); %second points (black asterisks)
    axis equal;
    

    现在xy(以及secondPoint_xsecondPoint_y的扩展名)将是长度为6的向量(因为6是距离),其中第i个element是第一个(或第二个)点的第i个 x (或 y )组件。 enter image description here

答案 1 :(得分:0)

这是Alessiox's answer的改进。它遵循相同的逻辑,首先生成一组与主圆边界至少距离为[X1 Y1]的点(D),然后生成第二组点([X2 Y2])与第一组完全距离D

cx = 50; cy = -50; cr = 200;
D = [10.5 44.8 30.01 37.2 23.4 49.1]';
n = numel(D);

R1 = rand(n, 1) .* (cr - D);
T1 = rand(n, 1) * 2 * pi;
X1 = cx+R1.*cos(T1);
Y1 = cy+R1.*sin(T1);

T2 = rand(n, 1) * 2 * pi;
X2 = X1+D.*cos(T2);
Y2 = Y1+D.*sin(T2);

enter image description here