您可以使用两步方法解决问题。你可以
- 随机生成第一个点,然后可以考虑以该点为圆心,半径为
D中的距离的圆
- 绘制圆后,该圆上的每个点与之前创建的第一个点的距离为
D,通过随机选择其中一个候选点,您将获得第二个点
让我们看一个例子:假设你的 main 圆的半径为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 个元素是第i 个x(或 y)分量用于第一个(或第二个)点。