很容易證明,在任何平面上的多邊形的投影的重心是在那架多邊形的質心的投射。
因此,只需計算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]
多邊形是否偏離平面?你得到的答案將取決於此。 – duffymo
是的,它不是在xy平面上,多邊形是在xyz之間,當我手動找到中心點時,所有的座標都不同於0. –
你是指一個質心位置的中心嗎?你必須做一個整合。你知道微積分嗎? – duffymo