找到曲面中心的坐标x y z

时间:2016-05-17 10:43:53

标签: ruby math 3d surface centroid

我在3D空间中有一个表面,我需要计算该表面中心的坐标。表面是多边形。

我找到了这个公式:

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。

我该怎么做?

我需要选择曲面的中心,但它们可能有任何形状,因为它们是多边形。

非常感谢。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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用于x-y投影,y1z用于y-z投影。