2016-07-16 1 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을 갖는 두 번째 점들 ([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

두 단계 접근법을 사용하여 문제를 해결할 수 있습니다. 당신은

  1. 무작위로 첫 번째 점을 생성 할 수 있습니다 그리고 당신은 그 중심이 지점이며 반지름 당신이 원을 그리 않았다 일단 D
  2. 의 거리이며, 모든 지점이 그 원에 누워 원을 고려할 수있는 것 당신이

이의이 예제를 보자 두 번째 지점을해야 거리 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 

안에이 루프 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_x 나아가서 secondPoint_y)은 길이 6의 벡터 될 i 번째의 요소는 i 번째 X (또는 인 (6은 거리가 있기 때문에) y) 구성 요소의 첫 번째 (또는 두 번째) 점입니다. enter image description here

+0

극좌표로 랜덤 포인트를 생성하지 않는 이유는 무엇입니까? 그런 다음'while' 루프를 제거하고 많은 후보 이웃을 생성 할 수 있습니다. – saastn

+0

감사합니다. @Alessiox. Alessiox! 다른 색깔의 원을 그릴 방법을 코드로 알려 주시겠습니까? – user3727281

+0

@ user3727281 코드가 추가되었습니다 – Alessiox

관련 문제