Sie können das Problem in zwei Schritten angehen. Sie können
- 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
- , 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 x
y
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: 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.
so tun Sie erhalten möchten 'a' und 'b' gegeben, dass Sie die Beziehung' D = (b - a) wissen. * Rand (6,1) + a'? –