将XY数据转换为多边形,然后顺时针对它们进行排序

时间:2016-01-20 11:24:52

标签: matlab math functional-programming geometry

我有数据集(由子集的总和形成,因此未排序),Id喜欢把它变成多边形。

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

(在左边)。多边形必须包含所有点,以及CANT相交的行。

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

感谢任何想法,Ben

编辑:以下是我需要做的一个小例子 - 我需要将蓝色多边形转换为红色多边形,因此没有交叉点。

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:我终于设法摆脱了多余的数据,所以这里是我试图拟合的实际数据(蓝点),matlab在左边使用convhull时的数据拟合,以及它的支持看起来如何,用绿线 - 在右边。

我曾尝试在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')

2 个答案:

答案 0 :(得分: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)]);

答案 1 :(得分:0)

我有建议,虽然我不是100%肯定它会适用于所有可能的积分。

步骤1:从点的凸包开始并生成多边形。

步骤2:收集所有不属于凸包的点。

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

步骤4:选择距离最小的点并将最接近的线段分开,以通过此点。

步骤5:从步骤2开始重复,直到包含所有点。