2016-05-17 119 views
-1

我在3D空間中有一個表面,我需要計算該表面的中心座標。表面是一個多邊形。查找表面中心的座標x y z

我發現了這個公式:

X1 += SUM[(xi + xi+1) * (xi* yi+1 - xi+1 * yi)]/6/area 
Y1 += SUM[(yi + yi+1) * (xi* yi+1 - xi+1 * yi)]/6/area 

但它僅適用於2D。它給出x和y值。在我的情況下,我需要3個座標,x y z。

我該怎麼做?

我需要所選表面的中心,但它們可能具有任何形狀,因爲它們是多邊形。

非常感謝。

+0

多邊形是否偏離平面?你得到的答案將取決於此。 – duffymo

+0

是的,它不是在xy平面上,多邊形是在xyz之間,當我手動找到中心點時,所有的座標都不同於0. –

+0

你是指一個質心位置的中心嗎?你必須做一個整合。你知道微積分嗎? – duffymo

回答

0

很容易證明,在任何平面上的多邊形的投影的重心是在那架多邊形的質心的投射。

因此,只需計算x-y平面和y-z平面上多邊形投影的質心,就可以得到多邊形質心的座標。

#!/usr/bin/env ruby 

Point = Struct.new(:x, :y, :z) 

def centroid(vertices, dimensions: [:x, :y]) 
    area = 0 
    centroid_x, centroid_y = 0, 0 
    vertices.count.times do |i| 
    v1, v2 = vertices[i, 2] 
    v2 ||= vertices[0] 
    x1, y1 = dimensions.map{|d| v1.send(d)} 
    x2, y2 = dimensions.map{|d| v2.send(d)} 
    a = x1 * y2 - x2 * y1 
    area += a 
    centroid_x += (x1 + x2) * a 
    centroid_y += (y1 + y2) * a 
    end 

    area *= 0.5 
    centroid_x /= (6.0 * area) 
    centroid_y /= (6.0 * area) 
    [centroid_x, centroid_y] 
end 

vertices = [ 
    Point.new(1, 0, 0), 
    Point.new(0, 2, 0), 
    Point.new(0, 0, 3) 
] 

p centroid(vertices, dimensions: [:x, :y]) 
p centroid(vertices, dimensions: [:y, :z]) 
p centroid(vertices, dimensions: [:z, :x]) 

打印

[0.3333333333333333, 0.6666666666666666] 
[0.6666666666666666, 1.0] 
[1.0, 0.3333333333333333] 
0

@Aetherus它並沒有對我的工作,例如:

X1 = 0 
Y1 = 0 
Y11 = 0 
Z1 = 0 

for i in 0..d.vertices.size-2   
    X1 += (d.vertices[i].position[0] + d.vertices[i+1].position[0]) * (d.vertices[i].position[0] * d.vertices[i+1].position[1] - d.vertices[i+1].position[0] * d.vertices[i].position[1]) 

    Y1 += (d.vertices[i].position[1] + d.vertices[i+1].position[1]) * (d.vertices[i].position[0] * d.vertices[i+1].position[1] - d.vertices[i+1].position[0] * d.vertices[i].position[1])    

    Y11 += (d.vertices[i].position[1] + d.vertices[i+1].position[1]) * (d.vertices[i].position[1] * d.vertices[i+1].position[2] - d.vertices[i+1].position[1] * d.vertices[i].position[2])   

    Z1 += (d.vertices[i].position[2] + d.vertices[i+1].position[2]) * (d.vertices[i].position[1] * d.vertices[i+1].position[2] - d.vertices[i+1].position[1] * d.vertices[i].position[2]) 
end    

x=X1/(6.0*(d.area))    
y=Y1/(6.0*(d.area)) 
y1=Y11/(6.0*(d.area))   
z=Z1/(6.0*(d.area)) 

UI.messagebox("x1 #{x} Y1 #{y} \n y11 #{y1} z1 #{z}") 

用 「d」 是我的多邊形中的xy對於XY投影和y1z爲YZ投影。

+0

我重新格式化了您的代碼。我認爲問題出在你的'0..d.vertices.size-2'部分,它應該是'0 ..(d.vertices.size-1)'(我不知道哪一個是.. '和'-'具有更高的優先級)或'0 ... d.vertices.size',因爲您需要遍歷每個邊。 – Aetherus

+0

您不應該使用大寫字母作爲變量名稱。在Ruby中,大寫的標識符是用於常量的。 – Aetherus

+0

而且你不應該把你的'X1'劃分爲多邊形區域的6倍。你應該把它們分成6次** xy平面上投影的面積**。 'Y1','Y11'和'Z1'一樣。 – Aetherus