2017-08-09 53 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 –