2016-01-20 57 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