2016-05-17 21 views
-1

Ich habe eine Oberfläche in einem 3D-Raum, und ich muss die Koordinaten der Mitte dieser Oberfläche berechnen. Die Oberfläche ist ein Polygon.Finden der Koordinaten x y z der Mitte einer Oberfläche

fand ich diese Formel:

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 

Aber es funktioniert nur für 2D. Es gibt x- und y-Werte. In meinem Fall brauche ich 3 Koordinaten, x y z.

Wie kann ich das tun?

Ich brauche die Mitte der ausgewählten Flächen, aber sie können eine beliebige Form haben, da sie ein Polygon sind.

Vielen Dank.

+0

Ist das Polygon aus der Ebene verzogen? Die Antwort hängt davon ab. – duffymo

+0

ja es ist nicht auf der XY-Ebene, das Polygon liegt zwischen XYZ, wenn ich den Mittelpunkt manuell finden alle Koordinaten sind anders als 0 –

+0

meinst du ein Zentrum der Massenposition? Sie müssen eine Integration durchführen. Kennst du Kalkül? – duffymo

Antwort

0

Es ist einfach, dass der Schwerpunkt der Projektion eines Polygons auf jeder Ebene zu beweisen, auf dieser Ebene die Projektion des Schwerpunktes dieses Polygon ist.

Berechnen Sie einfach den Schwerpunkt der Projektionen des Polygons auf der x-y-Ebene und y-z-Ebene, und Sie erhalten die Koordinate des Schwerpunkts dieses Polygons.

#!/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]) 

druckt

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

@Aetherus es nicht für mein Beispiel nicht funktioniert:

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}") 

Mit "d" ist mein Polygon die xy für xy-Projektion und y1z für yz ist Projektion.

+0

Ich habe Ihren Code neu formatiert. Ich denke, das Problem liegt in deinem '0..d.vertices.size-2'-Teil, der' 0 .. (d.vertices.size-1) 'sein sollte (ich weiß nicht, welcher von' .. 'und' -' hat höhere Priorität) oder '0 ... d.vertices.size', weil Sie jede Kante durchlaufen müssen. – Aetherus

+0

Sie sollten keine Großbuchstaben als Variablennamen verwenden. In Ruby sind großgeschriebene Bezeichner für Konstanten. – Aetherus

+0

Und Sie sollten Ihre 'X1' nicht um das 6-fache des Polygonbereichs teilen. Sie sollten sie durch 6 mal teilen ** die Fläche der Projektion auf der xy Ebene **. Gleiches für 'Y1',' Y11' und 'Z1'. – Aetherus