2017-04-24 48 views
1

我想繪製一些隨機數圈,由3和25 Matlab的:求x點有相同的距離

所以之間

距離分開,如果每個圓的半徑是5,其中心之間的距離必須在13和35之間

這裏是我當前的代碼,但不工作:

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

如果每個圓的半徑是5,你應該讓它們分開5(半徑圓左)+5(半徑圓右)+3(最小距離)= 13,而不是8。 –

+0

是的,它是可靠的! – gpbdr13

+0

指定爲什麼「它不起作用」。有明顯的編程錯誤(沒有參數的大小,創建之前調用的num_cluster等)。你是否複製粘貼這段代碼,你需要它的工作,或者代碼運行,但是算法中存在概念上的問題? –

回答

0

That'sa略有不同的看法您的解決方案,但它工作得很好。你可以直接在matlab中運行它並查看結果。讓我知道

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) 

顯然,如果你正在尋找太多圈,或大的,在過小的空間,搜索一定數量的迭代之後停止。

相關問題