2016-07-16 13 views
0

wird angenommen, dass ich einen Vektor mit 6 Distanzelemente alsWie generiert man zufällige Positionen mit Abstand zwischen ihnen?

D = [10.5 44.8 30.01 37.2 23.4 49.1]. 

Ich versuche zufällige Paar Positionen einer bestimmten Abständen zu schaffen haben, innerhalb eines 200 Meter-Kreis. Beachten Sie, dass der Abstand D mit (b - a).*rand(6,1) + a, mit a = 10 und b = 50 in Matlab erstellt wird. Ich weiß nicht, wie man die zufälligen Paare mit gegebenen Abständen erzeugt.

Kann mir jemand helfen, diese Art von Szenario zu generieren?

+1

so tun Sie erhalten möchten 'a' und 'b' gegeben, dass Sie die Beziehung' D = (b - a) wissen. * Rand (6,1) + a'? –

Antwort

0

Dies ist eine Verbesserung zu Alessiox's answer. Es folgt der gleichen Logik, zuerst eine Reihe von Punkten ([X1 Y1]) generieren, die mindestens Abstand von der Hauptkreisgrenze haben, dann generieren Sie die zweite Menge von Punkten ([X2 Y2]), die genaue Entfernung aus dem ersten Satz haben.

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

Vielen Dank für Ihre Hilfe @ saastn Konnten Sie den Code, wie man den Kreis zeichnet? – user3727281

+0

@ user3727281 sicher, ich benutze ** Methode 12 ** von [hier] (http://stackoverflow.com/a/37990100/2093077) – saastn

+0

Vielen Dank @ saastn – user3727281

0

Sie können das Problem in zwei Schritten angehen. Sie können

  1. zufällig den ersten Punkt erzeugen und dann können Sie den Kreis, dessen Mittelpunkt dieser Punkt betrachten und dessen Radius der Abstand in D
  2. , sobald Sie den Kreis gezogen hat, jeder Punkt auf dem Kreis liegen wird D vom ersten Punkt haben Abstand vorher erstellt und durch zufällige Auswahl einer dieser Kandidaten werden Sie den zweiten Punkt haben

mit einem Beispiel sehen lassen: Angenommen, Sie Haupt Kreis hat Radius 200 ein d sein Zentrum ist (0,0), also beginnen wir mit der Deklaration einiger Hauptvariablen.

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

Lassen Sie sich nun die erste Distanz betrachten, D(1)=10.5 und wir nun den ersten Zufall Punkt, erzeugen (zusammen mit seinem gepaarten Punkt - ich denke, Sie wollen innerhalb und die anderen außerhalb des Hauptkreises nicht einen Punkt) muß innerhalb des Hauptkreises liegen

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 

und am Ende dieser Schleife und xy wird unsere erste Punktkoordinaten sein.

Jetzt werden wir alle seine Nachbarn erzeugen, also mehrere Kandidaten, um der zweite Punkt in dem Paar zu sein. Wie bereits gesagt, sind diese Kandidaten die Punkte, die auf dem Kreis liegen, dessen Mittelpunkt (x,y) ist und dessen Radius D(1)=10.5 ist. Wir können diese Kandidaten wie folgt erstellen:

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

Jetzt xp und yp sind zwei Vektoren, die enthalten jeweils die x-Koordinaten und y-Koordinaten unserer Kandidaten, so werden wir jetzt wählen zufällig einen dieser

Schließlich ist das Paar (x,y) der erste Punkt und das Paar (secondPoint_x, secondPoint_y) ist unser zweiter Punkt. Das folgende Diagramm hilft, diese Schritte zusammenzufassen: enter image description here Der rote Kreis ist der Hauptbereich (Mittelpunkt in (0,0) und Radius 200), der rote Stern ist der erste Punkt (x,y) der blaue Kreis hat Mittelpunkt (x,y) und Radius 10.5 und schließlich ist das schwarze Sternchen der zweite Punkt des Paares (secondPoint_x, secondPoint_y), zufällig unter den Kandidaten auf dem blauen kleinen Kreis extrahiert.

Sie müssen sicherlich den gleichen Prozess für alle Elemente in D wiederholen oder sich auf den folgenden Code verlassen, der das Gleiche tut, ohne alle Elemente in D zu durchlaufen.

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; 

Jetzt x und y (und secondPoint_x und secondPoint_y durch Verlängerung) wird Vektor der Länge 6 sein (weil 6 sind die Abstände), in dem das i-te Element der i-ten x (oder y) Komponente für den ersten (oder zweiten) Punkt. enter image description here

+0

Warum generieren Sie nicht Ihre zufälligen Punkte in Polarkoordinaten? Dann können Sie die 'while' Schleife entfernen und viele Kandidaten-Nachbarn erzeugen. – saastn

+0

Vielen Dank @Alessiox. Alessiox! Können Sie mir den Code geben, wie man den Kreis mit der unterschiedlichen Farbe in Ihrer Figur plant? – user3727281

+0

@ user3727281 Code hinzugefügt – Alessiox