2016-07-16 13 views
0

は私が200メートルの円内に、所定の距離のランダム対位置を作成しようとしているどのようにそれらの間の距離を持つランダムな位置を生成するには?

D = [10.5 44.8 30.01 37.2 23.4 49.1]. 

として6つの距離要素を有するベクトルを有すると仮定する。距離Dは(b - a).*rand(6,1) + aを使用して作成され、Matlabではa = 10b = 50となります。私はどのように距離を与えられたランダムなペアを生成するか分からない。

このようなシナリオの生成に誰か助けてくれますか?

+1

はそうあなたが与えられた' A'と 'B'を取得したいですか? –

答えて

0

これはAlessiox's answerの改善点です。同じ論理に従うと、最初に、主円の境界から少なくともDの距離を有する点の集合([X1 Y1])を生成し、最初の集合から正確な距離Dを有する点の第2の集合([X2 Y2])を生成する。 。*ランド(6,1)+ A` - あなたは関係 `D =(A、B)を知っていることを

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

+0

あなたのご協力ありがとうございます@ saastn サークルを描く方法をコードを投稿できますか? – user3727281

+0

@ user3727281確かに、私は**ここで[方法] 12 **を使用する(http://stackoverflow.com/a/37990100/2093077) – saastn

+0

ありがとうたくさんの@ saastn – user3727281

0

2段階アプローチで問題に対処できます。あなた

  1. はランダムに最初のポイントを生成することができ、その後、あなたはすべての点は、その円の意志に横たわって、その中心と半径あなたが円を描くやったらD
  2. での距離であり、その点がある円を考慮することができます以前に作成した最初のポイントからの距離Dを持っており、これらの候補の一つをランダムに選択することにより、あなたは第二の点

はのは、例を見てみましょう必要があります:のはメイン円は半径200 ANを持っているあなたを言わせてその中心は(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の終わりに私たちの最初の点の座標になります内にある必要があります。

ここでは、すべての近隣ノードを生成し、ペアの2番目の候補となる候補をいくつか作成します。前述のように、これらの候補は、中心が(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含む2つのベクトルがあり、それぞれ、x座標と私たちの候補者のy座標は、したがって、私たちは今、ランダムにこれら

のいずれかを選択しなければなら
% second point 
idx=randsample(1:length(xp),1); 
secondPoint_x=xp(idx); 
secondPoint_y=yp(idx); 

最後に、(x,y)のペアが最初のポイントになり、(secondPoint_x, secondPoint_y)のペアが2番目のポイントになります。次のプロットは、これらの手順を要約役立ちます enter image description here赤い円がメイン領域(中心(0,0)と半径200)であり、赤いアスタリスクは、最初のポイント(x,y)青色少し円は中心(x,y)と半径10.5を有し最後に、黒のアスタリスクは、青の小さな円の上に横たわる候補の中からランダムに抽出された(secondPoint_x, secondPoint_y)のペアの2番目のポイントです。

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_xひいてはsecondPoint_y)は、長さ6のベクトルとなり、i番目の要素がi番目X(又はである(図6は距離があるため) y)成分の第1(または第2)点に対する成分である。 enter image description here

+0

ランダム座標を極座標で生成してみませんか?その後、 'while'ループを削除して、たくさんの候補の隣人を生成することができます。 – saastn

+0

ありがとう@Alessiox。 Alessiox!異なる色の円をどのようにプロットするかをコードに教えてください。 – user3727281

+0

@ user3727281コードが追加されました – Alessiox

関連する問題