2015-01-06 6 views
0

В настоящее время у меня есть ArrayList вершин в трехмерной картезированной системе координат. Многоугольник случайный. Это может быть машина, чашка или даже дракон.Центр масс случайного 3D-многоугольника (файл obj или stl-файл)

Предполагая, что плотность не меняется, как вычислить центр масс (x, y, z) этого 3D-объекта?

Я храню грани и вершины в ArrayList.

public ArrayList<stlFace> StlFaces = new ArrayList<stlFace>(); 
public ArrayList<VertexGeometric> VertexList = new ArrayList<VertexGeometric>(); 
+1

Вам необходимо вычислить интеграл моментов массы и делить его на общую массу. Это хорошо документировано в Интернете. Время для Google ;-) И прежде чем вы слишком глубоко задумаетесь, вы можете найти библиотечную функцию, чтобы сделать это за вас. – Bathsheba

+0

@ Батшеба Спасибо! У вас есть хорошая ссылка? Я считаю, что интеграция должна быть верным путем. –

ответ

0

я использовал this для вычисления поверхности, которая пропорциональна массе каждой грани или треугольника. И для вычисления центральной массы каждого треугольника и центра масс всего объекта я использовал this. Я добавил вспомогательные методы getCenter() и getSurface() в класс Face, чтобы инкапсулировать вычисления, относящиеся только к одной грани/треугольнику.

public static class Vertex { 

    public float x = 0; 
    public float y = 0; 
    public float z = 0; 

    public Vertex(float x, float y, float z) { 
     this.x = x; 
     this.y = y; 
     this.z = z; 
    } 
} 

public static class Face { 

    public Vertex v1; 
    public Vertex v2; 
    public Vertex v3; 

    public Face(Vertex v1, Vertex v2, Vertex v3) { 
     this.v1 = v1; 
     this.v2 = v2; 
     this.v3 = v3; 
    } 

    public Vertex getCenter() { 
     Vertex triangleCenter = new Vertex(0, 0, 0); 
     triangleCenter.x += v1.x; 
     triangleCenter.x += v2.x; 
     triangleCenter.x += v3.x; 
     triangleCenter.y += v1.y; 
     triangleCenter.y += v2.y; 
     triangleCenter.y += v3.y; 
     triangleCenter.z += v1.z; 
     triangleCenter.z += v2.z; 
     triangleCenter.z += v3.z; 
     triangleCenter.x /= 3; 
     triangleCenter.y /= 3; 
     triangleCenter.z /= 3; 
     return triangleCenter; 
    } 

    public float getSurface() { 
     float x1 = v1.x - v2.x; 
     float x2 = v1.y - v2.y; 
     float x3 = v1.z - v2.z; 
     float y1 = v1.x - v3.x; 
     float y2 = v1.y - v3.y; 
     float y3 = v1.z - v3.z; 
     return (float) Math.sqrt(
       Math.pow(x2 * y3 - x3 * y2, 2) + 
       Math.pow(x3 * y1 - x1 * y3, 2) + 
       Math.pow(x1 * y2 - x2 * y1, 2) 
      )/2f; 
    } 
} 

public static Vertex calculateMassCenter(List<Face> faces) { 
    Vertex massCenter = new Vertex(0, 0, 0); 
    float mass = 0; 
    for (Face face : faces) { 
     Vertex triangleCenter = face.getCenter(); 
     float faceMass = face.getSurface(); 
     mass += faceMass; 
     massCenter.x += faceMass * triangleCenter.x; 
     massCenter.y += faceMass * triangleCenter.y; 
     massCenter.z += faceMass * triangleCenter.z; 
    } 
    massCenter.x /= mass; 
    massCenter.y /= mass; 
    massCenter.z /= mass; 
    return massCenter; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^