Естественные науки

Центр тяжести сложной фигуры

Имеется фигура, которую разбиваем на трапеции (пусть, для начала, разбиваем ее на 8 трапеций) .

Через равные промежутки времени происходит "разгрузка" данной фигуры - в один момент времени отрезаем у нее треугольник 1, во второй момент времени - треугольник 1 и трапецию 2, в третий - фигуры 1,2,3 и т. д. , до тех пор, пока она полностью "не разгрузиться" (подобие ковша, из которого пластами высыпается материал) . В каждый момент времени необходимо определить центр тяжести данной фигуры (ширина "ковша" для вычисления объема известна) .

Суть метода понятна - разбили на трапеции, определили координаты их центров тяжести в системе Х*У* - повернули систему до ХУ и по формуле определили координату центра тяжести всей фигуры. Вопрос заключается в следующем, как теперь от частного случая (от 8 фигур) перейти к разбиению на бесконечно большое количество трапеций?
Может кто-то другой метод посоветует, а то я дилетант в этом деле))))) , могу что-то и напутать. Спасибо!
давайте подскажу способ попроще.
1. у плоского треугольника координаты центр масс - среднее арифметическое координат углов.
2. у многоугольника (любого) мы можем посчитать взвешенную векторную сумму центров масс треугольников, в которых два угла - концы стороны многоугольника, третий - любая точка, в том числе и вне треугольника. Самое простое в качестве такой точки взять начало отсчета или центр тяжести контура, первое проще, второе уменьшает погрешности вычислений, если координаты - очень большие числа.
Изюминка тут - что в качестве веса треугольника берется площадь со знаком.

В виде программы на Си++ это выглядит как-то так:

N - число углов, ln - массив 2-х мерных точек.

-----------
long double S = 0, t;
TPoint2 c(0,0), r(0,0);

if(!N)
return TPoint2(0,0);

for(int i = 0; i < N; i++)
c += ln;
c /= N;

if(N <= 3)
return c;

for(int i = 0, j = 1; i < N; i++, j = (j+1) % N){
TPoint2 lni = ln - c,
lnj = ln[j] - c;
t = lni.x * lnj.y - lni.y*lnj.x; // это - площадь треугольника
S += t;
r += t * (lni + lnj); // центр тяжести треугольника с весом, но надо еще поделить на 3
}

return fabs(S) > 1e-30? r / (3*S) + c : c;
-----------------
МА
Молдир Амирбекова
52 914
Лучший ответ