假设我有一个带有6个距离元素的向量
D = [10.5 44.8 30.01 37.2 23.4 49.1].
我正在尝试在200米的圆圈内创建给定距离的随机对位置。请注意,在Matlab中使用(b - a).*rand(6,1) + a
创建距离D,a = 10
和b = 50
。我不知道如何在给定距离的情况下生成随机对。
有人可以帮助我制作这种情景吗?
答案 0 :(得分:0)
您可以使用两步法解决问题。你可以
D
D
,并且通过随机选择其中一个候选你将获得第二个点让我们看一个例子:假设您主圈子的半径为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
在此循环结束时x
和y
将是我们的第一个点坐标。
现在我们将生成它的所有邻居,因此几个候选者成为该对中的第二个点。如前所述,这些候选人将是位于中心为(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;
现在xp
和yp
是两个向量,分别包含我们候选人的x坐标和y坐标,因此我们现在将随机选择其中一个
% second point
idx=randsample(1:length(xp),1);
secondPoint_x=xp(idx);
secondPoint_y=yp(idx);
最后,对(x,y)
是第一个点,而(secondPoint_x, secondPoint_y)
对是我们的第二个点。以下图表有助于总结这些步骤:
红色圆圈是主要区域(中心位于(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;
现在x
和y
(以及secondPoint_x
和secondPoint_y
的扩展名)将是长度为6的向量(因为6是距离),其中第i个element是第一个(或第二个)点的第i个 x (或 y )组件。
答案 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);