Найти центр тяжести многоугольника со взвешенными вершинами - PullRequest
7 голосов
/ 14 мая 2010

Я знаю, как найти центроид (центр масс) правильного многоугольника.Это предполагает, что каждая часть многоугольника весит одинаково.Но как рассчитать центр тяжести невесомого многоугольника (возможно, из аэрогеля :), где каждая вершина имеет вес?

Упрощенная иллюстрация того, что я имею в виду, используя прямую линию:

5kg-----------------5kg
           ^center of gravity

10kg---------------5kg
        ^center of gravity offset du to weight of vertices

Конечно, я знаю, как рассчитать центр тяжести на прямой линии с взвешенными вершинами, но как мне это сделать на многоугольнике с взвешенными вершинами?

Спасибо за ваше время!

Ответы [ 3 ]

17 голосов
/ 14 мая 2010

Вы хотите взять средневзвешенное значение по всем вершинам. Итак, скажем, ваши вершины v1, v2, v3 .... vn с массами m1, m2 ... mn и имеют координаты x и y v1x, v1y, v2x, v2y и т. Д., Чтобы получить центр масс (cx, cy) Вы хотите:

cx = (v1x*m1 + v2x*m2 + ... vnx*mn) / (m1 + m2 .... mn) 
cy = (v1y*m1 + v2y*m2 + ... vny*mn) / (m1 + m2 .... mn)

Это по сути тот же принцип, что и когда вы делаете это для строки.

6 голосов
/ 14 мая 2010

1) Создать вектор для каждой вершины

2) Умножим каждый вектор на вес вершины

3) Сумма векторов

4) Разделить на общую массу

5) Вот ваш центр масс!

1 голос
/ 14 мая 2010

Формула будет:

Mc = ( sum_from_0_to_max(vertices)( m_i * P_i ) / M )

, где Mc - центр масс, m_i - масса вершины i, P_i позиция и M общая масса.

Попробуйте поискать "твердые тела" в Google, думаю, вы найдете много полезной информации.

Edit:

В коде это будет примерно так:

   Vector3D result; // initialized with 0, 0, 0  
   Vector3D temp; // sum  
   long sumMasses = 0;  
   for( Vertex v : vertices ) {  
      temp += (v.mass * v.position);  
      sumMasses+=v.mass;  
   }  
   result = temp / sumMasses;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...