Я знаю, как найти центроид (центр массы) правильного многоугольника. Это предполагает, что каждая часть полигона взвешивает то же. Но как я вычисляю центроид невесомого полигона (сделанный из аэрогеля, возможно, :), где каждая вершина имеет вес?
Упрощенная иллюстрация того, что я означаю использовать прямую линию:
5kg-----------------5kg
^center of gravity
10kg---------------5kg
^center of gravity offset du to weight of vertices
Конечно, я знаю, как вычислить центр тяжести на прямую линию со взвешенными вершинами, но как я делаю это на полигоне со взвешенными вершинами?
Спасибо за внимание!
Вы хотите получить средневзвешенное значение по всем вершинам. Скажем, ваши вершины 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)
По сути, это тот же принцип, что и для строки.
1) Сгенерируйте вектор для каждой вершины
2) Умножьте каждый вектор на вес вершина
3) Суммируйте векторы
4) Разделите на общую массу
5) Вот ваш центр масс!
Формула будет выглядеть так:
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;