2016-01-20 23 views
1

我得到了数据集(由子集的总和形成,因此它是未排序的)和Id想要将它变成多边形。将XY数据转换成多边形,然后顺时针排序

是否有一个简单的Matlab程序,将数据集排序/变成多边形?多边形的数据形式轮廓,但它们不是正确的顺序: enter image description here

(在左边)。多边形必须由所有点组成,并且线条与CANT相交。

可悲的是多边形不是凸的,所以convhull不会工作:C

感谢您的任何想法,本

编辑:继承人什么,我需要做一个小例子 - 我需要转换的蓝色多边形变成红色,所以没有交点。

x1 = [0,  1,  2,  1,  2,  0] 
x2 = [0,  1,  2,  2,  1,  0] 
y1 = [2,  1,  3,  3,  1,  2] 
y2 = [2,  1,  1,  3,  3,  2] 

plot(x1,y1,'b-*') 
axis([0,3,0,4]) 
pause 
hold on, plot(x2,y2,'r-o') 

编辑2:香港专业教育学院终于成功地摆脱多余的数据,所以这里的实际数据我试着去适应(蓝点),使用convhull到左侧时,通过MATLAB数据拟合,其应该如何看,用绿线编辑 - 在右边。

我试着在Matlab中寻找哈密尔顿路径,但没有找到任何直接的命令,是否有一个呢? enter image description here 而这里的数据:

data1=[19.4500010000000 50500000;19.4500010000000 52810000;19.4500010000000 55200000;19.4599990000000 55200000;19.6900010000000 48800000;19.7910002000000 55200000;19.8560000000000 55200000;20.0100000000000 55200000;20.1500000000000 55200000;26.8099990000000 54700000;26.8099990000000 54700000;27.8300000000000 54500000;27.8300000000000 54500000;27.8300000000000 54500000;25.4047236012803 43066163.6552646;38.2799990000000 8420000;38.2799990000000 8420000;38.2799990000000 8420000;36.4199980000000 5270000;36.4199980000000 5270000;36.4199980000000 5270000;36.4199980000000 5270000;49.1845567757586 1577538.50621129;47.4100000000000 926524;47.4100000000000 926524;47.4100000000000 926524.000000004;47.4100000000000 926524;61.1736702657022 365441.704934877;58.3499980000000 230682;58.3499980000000 230682;71.8983466422650 108263.586243626;69.5500030000000 74543.3000000000;79.6100010000000 30424.7000000000;79.7029992000000 30424.7000000000;79.7699970000000 30424.7000000000;83.6800000000000 31281.3000000000;83.6800000000000 31693.1300000000;83.6800000000000 32131.1000000000] 
c1=[1;5;19;24;29;32;33;34;35;36;37;38;12;11;9;8;7;6;4;3;2;1] 
semilogy(data1(:,1),data1(:,2),'-*b') 
hold on, semilogy(data1(c1,1),data1(c1,2),'r') 
+1

有关StackOverflow的问题一般应包含[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。请[编辑](http://stackoverflow.com/posts/34898713/edit)您的问题,以确保您的问题中的代码是**最小**(只需要重现的代码),**完整**(所有需要重现的代码)和**可验证的**(我们应该能够仅使用问题中的代码重现问题,没有什么比这更重要)。 – excaza

+0

我一直希望我的一般解释能够适用于现在,因为我仍在努力获取所述数据集,但是我现在添加一个小例子来使用。 – Benjikshoo

+0

不清楚你如何定义多边形,想想例子'[0 0; 0 1; 1 0; -1 0; 0 -1]'。哪个订单是正确的?什么时候通过中心点? – Daniel

回答

2

您可以根据相对于分中心的角度积分排序如下:

%Generate random example 
n = 10; 
x = rand(1,n); 
y = rand(1,n); 
%Find the order of the points 
[~,porder] = sort(atan2(y-mean(y),x-mean(x))); 
xsort = x(porder); 
ysort = y(porder); 
%Plot polygon 
scatter(x,y); 
hold on; 
plot([xsort,xsort(1)],[ysort,ysort(1)]); 
+0

考虑到多边形可以是凹面的,这并不能保证工作。 – Suever

+1

@Suever根据问题的表述和绘制的示例,允许多边形为凹形,而不是相交。 –

+0

这是什么http://imgur.com/L3IbJze – Suever

0

我有建议,虽然我不是100%确定它将适用于所有可能的积分收集。

第1步:开始点的凸包并生成一个多边形。

第2步:收集所有不属于凸包的部分。

第3步:然后确定每个点到凸包多边形的任何部分的最短距离。

第四步:选取距离最近的点并拆分它最接近的点,以通过该点。

第5步:从第2步重复,直到包括所有点。

+0

这可以工作,但它听起来像很多编码...会问问周围,看看我的朋友中有没有人可以访问2014b,所以我可以尝试使用'边界'功能,应该只用一个命令来完成。 。 不管怎么说,还是要谢谢你 :] – Benjikshoo