Найдите центроид полигона со взвешенными вершинами

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

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

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

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

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

Спасибо за внимание!

7
задан skaffman 14 May 2010 в 08:31
поделиться

3 ответа

Вы хотите получить средневзвешенное значение по всем вершинам. Скажем, ваши вершины 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)

По сути, это тот же принцип, что и для строки.

17
ответ дан 6 December 2019 в 07:25
поделиться

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

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

3) Суммируйте векторы

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

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

6
ответ дан 6 December 2019 в 07:25
поделиться

Формула будет выглядеть так:

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

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

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

Изменить:

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

   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;
1
ответ дан 6 December 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: