2017-04-24 9 views
1

ich eine bestimmte Anzahl von zufälligen Kreisen durch die Abstände zwischen 3 und 25Matlab: x Punkte mit gleicher Entfernung findet

Also, jedem Kreis, wenn der Radius 5, getrennt dargestellt werden soll, die Abstände zwischen ihren Zentren muss zwischen 13 und 35

Hier ist mein aktueller Code ist, funktioniert aber nicht:

ok=false; 
while 1 
    x = 100 * rand(100,1); 
    y = 100 * rand(100,1); 
    A = pdist2([x,y],[x,y]); 
    test1 = (A > 3 + size*num_clusters); 
    test2 = A < 30 + size*num_clusters; 
    test3 = test1.*test2; 
    num_clusters = 3; 
    for i=1:length(x) 
     sum(test3(i,:)) 
     if sum(test3(i,:)) > num_clusters 
      logic = test3(i,:); 
      logic = find(logic); 
      logic = logic'; 
      x = x(logic); 
      y = y(logic); 
      ok=true; 
      break 
     end 
     if ok 
      break 
     end 
    end 
    if ok 
     break 
    end 
end 

X(1:num_clusters,1) = x(1:num_clusters); 
X(1:num_clusters,2) = y(1:num_clusters); 
+0

Wenn der Radius jedes Kreises 5 ist, sollten Sie sie durch 5 (Radiuskreis links) + 5 (Radiuskreis rechts) + 3 (Mindestabstand) = 13, nicht 8 trennen. Habe ich bekommen, was Sie wollen? –

+0

Ja, es ist richtig! – gpbdr13

+0

Geben Sie an, warum "es nicht funktioniert". Es gibt offensichtliche Programmierfehler (Größe ohne Argument, num_cluster vor der Erstellung aufgerufen, etc ..). Haben Sie diesen Code kopieren kopieren und Sie müssen es funktioniert, oder der Code läuft, aber es gibt konzeptionelle Probleme im Algorithmus? –

Antwort

0

das ist eine zu Ihrer Lösung der etwas andere Art, aber es funktioniert gut. Sie können es einfach in Matlab ausführen, wie es ist, und die Ergebnisse sehen. lassen Sie mich wissen

patchCircle = @(diam,X,Y,spec) arrayfun(@(x,y) patch(sin(-pi:.1:pi).*diam +x,cos(-pi:.1:pi).*diam+y,spec{:}),X,Y); % patches a circle of diameter DIAM, centered in x,y 

radius_circles     = 2; 
min_distance_between_circles = 8; 
max_idstance_between_circles = 30; 
num_circles     = 6; 
size_area      = 40; % size of the area where the circles are 
maximumNumberOfIterations  = 1000; % maximum mumber of iterations to find each new circle 
exitSearch = false; 

circles = size_area * rand(1,2); 
for i_circle = 1 : num_circles - 1 
    j = 1; 
    keepLooping = true; 
    while keepLooping 
     j = j+1; 
     if j > maximumNumberOfIterations 
      fprintf('maximumNumberOfIterations reached. Increase area size or dicrease number of circles\n'); 
      keepLooping = false; 
      exitSearch = true; 
     end 
     newCoords = size_area * rand(1,2); 
     distances = pdist2(circles,newCoords); 
     isMoreThanMinSize = distances > (min_distance_between_circles + radius_circles*2); 
     isLessThanMaxSize = distances < (max_idstance_between_circles + radius_circles*2); 
     if all(isMoreThanMinSize & isLessThanMaxSize) 
      keepLooping = false; 
      circles(i_circle,:) = newCoords; 
      fprintf('circle n° %d of %d found\n',i_circle+1,num_circles) 
     end 
    end 
    if exitSearch 
     break 
    end 
end 
%% PLOT RESULTS 
    cla; patchCircle(radius_circles,circles(:,1),circles(:,2),{'r','facealpha',.2}) 
    ylim([0 size_area]+[-1 1]*radius_circles) 
    xlim([0 size_area]+[-1 1]*radius_circles) 

Selbstverständlich, wenn Sie zu viele Kreise suchen, oder zu große, in einem Raum, der zu klein ist, wird die Suche beendet nach einer bestimmten Anzahl von Iterationen.

Verwandte Themen