2017-08-09 82 views
1

我試圖生成一組點,其中m個點的組均勻分佈在一個大區域中。我已經解決了這個問題(下面的解決方案),但我正在尋找更優雅或至少更快的解決方案。將區域有效地劃分爲N個凸區域

假設我們有9個積分,我們希望在3個小組中放置一個x=[0,5]y=[0,5]指定的區域。然後,我首先在這個區域產生的網狀

meshx = 0:0.01:5; 
meshy = 0:0.01:5; 
[X,Y] = meshgrid(meshx,meshy); 
X = X(:); Y = Y(:); 

然後放置9/3 = 3組均勻我申請kmeans聚類

idx = kmeans([X,Y],3); 

然後,對於每個簇,我現在可以得出一個隨機樣品3分,這是我保存到列表:

pos = zeros(9,2); 
for i = 1:max(idx) 
    spaceX = X(idx==i); 
    spaceY = Y(idx==i); 
    %on = convhulln([spaceX,spaceY]); 
    %plot(spaceX(on),spaceY(on),'black') 
    %hold on 
    sample = datasample([spaceX,spaceY],3,1); 
    %plot(sample(:,1),sample(:,2),'black*') 
    %hold on 
    pos((i-1)*3+1:i*3,:) = sample; 
end 

如果取消註釋的意見,然後代碼也將繪製集羣和點中的位置。我所提到的問題主要是避免爲了使代碼更高效而對一個相當精細的統一網格進行聚類。

+0

如果有圖像處理工具箱可以生成'M'隨機點,並使用[bwd​​ist](HTTPS的第二輸出://www.mathworks .com/help/images/ref/bwdist.html)來分區空間。 – rahnema1

+0

你想舉個例子嗎? –

+0

kmeans的結果是不確定的。根據中心開始的隨機配置,您可能會得到不同的結果。你想要具有幾乎相同面積的多邊形?或者你想要多邊形具有不同的面積?應該隨機放置還是應該定期放置。 – rahnema1

回答

0

代替kmeans可以使用atan2

x= -10:10; 
idx=ceil((bsxfun(@atan2,x,x.')+pi)*(3/(2*pi))); 
imshow(idx,[]) 
+0

非常感謝您的回答,但是這僅適用於1-4區域,從5分開始,分區不再像「蛋糕切片」那樣行事。例如。嘗試將「kmeans」中的3更改爲5. –

+0

@NickyMattsson請嘗試'kmeans'並使用'meshx = 1:21'。結果與'atan2'相同。這是因爲網格的分辨率很粗糙。 – rahnema1

+0

問題不在於電網的粗糙程度。當你應用'atan2'時,結果看起來像是如何用從邊緣到中心的線條切片。這對於1-4切片是正確的,但對於5,這是不正確的。這是我應該得到的:http://imgur.com/lD8rLW4 –