2013-08-19 298 views
2

考慮在2D笛卡爾空間中使用簡單凸多邊形。如果給出以逆時針方向排序的頂點座標列表,如[[x0, y0], ..., [xn, yn]]。你怎麼能計算多邊形的中心(多邊形內的點是等於所有頂點)?如何在2D和3D空間中計算多邊形的中心點

還要考慮第二種情況,即將多邊形放置在3D笛卡爾空間中,並且其法向矢量不平行於任何笛卡爾座標軸。你怎麼能計算中心,而不旋轉的多邊形?

我可以閱讀C/C++,Fortran,MATLAB和Python,但是任何僞代碼也很好。

編輯

我現在意識到,我的問題不是適定。我爲此感到抱歉。看來我正在尋找的是多邊形的質心(即在假定密度均勻和均勻的重力場的情況下,紙板切口會平衡的點)。

+1

'mean(x)mean(y)'?我不確定所有多邊形(例如(0,0),(0,1),(0,-1),(3,0))處的四邊形點是否存在與所有頂點等距的點。 – Hugh

+0

這不是一個四邊形,而是一個T形 – Aeronaelius

+1

一般來說,大多數多邊形不會有與所有頂點等距的點。你知道他們是經常的嗎? – PeterM

回答

8

你對中心的定義一般沒有意義。

要看到這只是在一個平面上繪製三個不對齊的點,並計算出一個只有三個點通過的圓。顯然你的三角形的中心必須是這個圈子的中心。

現在畫出第四點,它不位於圓上並形成四邊形多邊形。什麼是中心?這個平面沒有一點與所有頂點等距。要注意的是,即使三角形使用與頂點等距離的點,也可以給出遠離多邊形的點和遠處的點,並且在數值上也不穩定(給定任意ε> 0且M> 0,您始終可以構建一個其中頂點的特定移動距離小於ε的三角形移動中心大於M的距離)。

計算簡單的常用「中心」是所有頂點的平均值,邊界的平均值,質心或甚至只是軸對齊邊界框的中心。但是,如果多邊形不是凸面的,它們都可以落在多邊形之外,但在您的情況下它們可能會工作。

最簡單的合理的(因爲它不依賴於座標系)爲頂點的重心(在Python代碼):

xc = sum(x for (x, y) in points)/len(points) 
yc = sum(y for (x, y) in points)/len(points) 

的一些壞事,但它只是分裂的一面該多邊形爲您提供了一個不同的中心(換句話說,它取決於頂點而不是由多邊形界定的一組點)。依賴於多邊形最簡單的是IMO的邊界的重心:

sx = sy = sL = 0 
for i in range(len(points)): # counts from 0 to len(points)-1 
    x0, y0 = points[i - 1]  # in Python points[-1] is last element of points 
    x1, y1 = points[i] 
    L = ((x1 - x0)**2 + (y1 - y0)**2) ** 0.5 
    sx += (x0 + x1)/2 * L 
    sy += (y0 + y1)/2 * L 
    sL += L 
xc = sx/sL 
yc = sy/sL 

他們兩人擴展到3D是平凡的...只是使用相同的公式新增z。在一個普通的(不一定是凸的,不一定是簡單連接的)多邊形的情況下,我發現有用但是不是簡單計算的「中心」是距離它的最大距離的(內)點,邊界(換句話說就是「最內在的」一點)。

在這種情況下,我使用離散(位圖)表示和高斯距離變換。

4

首先對於一個多邊形,質心並不總是意味着從質心到頂點的等距長度。在大多數情況下,這可能不是事實。也就是說,只需找到座標的平均值和座標的平均值即可找到質心。在Matlab中:centroidx = mean(xcoords)centroidy = mean(ycoords)是質心的座標。如果您真的需要更多,請參閱this

相關問題