[英]How to compute the center of a polygon in 2D and 3D space
考慮2D笛卡爾空間中的簡單凸多邊形 。 如果給出一個以逆時針方向排序的頂點坐標列表,如[[x0, y0], ..., [xn, yn]]
。 你怎么能計算多邊形的中心(多邊形內部與所有頂點等距的點 )?
還要考慮第二種情況,其中多邊形放置在3D笛卡爾空間中,其法向量不平行於任何笛卡爾軸。 如何在不旋轉多邊形的情況下計算中心?
我可以閱讀C / C ++,Fortran,MATLAB和Python,但是任何偽代碼也都很受歡迎。
編輯
我現在意識到我的問題沒有得到很好的解決。 我為此感到抱歉。 似乎我所尋找的是多邊形的質心(即,在假設均勻密度和均勻重力場的情況下紙板切口將平衡的點)。
你對中心的定義一般沒有意義。
要看到這一點,只需在一個平面上繪制三個非對齊點,並計算一個唯一的圓圈,通過所有三個點。 顯然,您的三角形中心必須是此圓的中心。
現在繪制第四個不在圓上並形成四邊形多邊形的點。 中心是什么? 平面中沒有與所有頂點等距的點。
另請注意,即使三角形使用與頂點等距離的點也可以給出外部和遠離多邊形的點,並且在數值上也不穩定(給定任何ε> 0且M> 0,您始終可以構建一個三角形,其中a頂點的特定移動小於ε的距離使中心移動大於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
。
在一般(不一定是凸起的,不一定是簡單連接的)多邊形的情況下,我發現有用的“中心”但是計算起來並不容易的是(a)與邊界最大距離的內點(在換句話說,“最內在”的觀點。
在這種情況下,我使用離散(位圖)表示和高斯距離變換。
首先,對於多邊形,質心可能並不總是暗示從質心到頂點的等距長度。 在大多數情況下,這可能不是真的。 話雖如此,您只需找到x
坐標的平均值和y
坐標的平均值即可找到質心。 在Matlab中: centroidx = mean(xcoords)
和centroidy = mean(ycoords)
是質心的坐標。 如果你真的需要更多,請看這個 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.