Вычисление моментов на плоскости

Моменты на плоскости можно вычислять относительно точек или прямых. В данном разделе будут рассматриваться моменты относительно прямых. Моментом первого порядка множества точек называется сумма произведений расстояний точек до прямой на массу точки. Расстояние берётся со знаком ( положительные и отрицательные полуплоскости ). В том случае, когда знак не учитывается момент называется абсолютным:

double momentum1Apnt ( CArrRef<Vector2d> point, const Line2d & line );

double momentum1Apnt ( CArrRef<Vector2d> point, CArrRef<double> mass, const Line2d & line );
Если множество точек непрерывно, то сумма заменяется на интегрирование.
Центр масс точек можно определить, как вектор у которого первая компонента равна моменту первого порядка относительно оси Y, а вторая - относительно оси X, и сумма масс точек равна 1. Имеются следующие функции вычисляющие центры масс у множества точек ( с одинаковой массой и с заданной ), у множества отрезков ( с одинаковой плотностью ) и у многоугольника ( с равномерной плотностью ):

Def<Vector2d> centerPnt ( CArrRef<Vector2d> point );

Def<Vector2d> centerPnt ( CArrRef<Vector2d> point, CArrRef<double> mass );

Def<Vector2d> centerSgm ( CArrRef<Segment2d> segm );

Def<Vector2d> centerPlg ( CArrRef<Vector2d> vert );

У всех функций результат не вычисляется в случае, когда сумма масс равна нулю.

Моментом второго порядка множества точек называется сумма произведений квадратов расстояний точек до прямой на массу точки:

double momentum2pnt ( CArrRef<Vector2d> point, const Line2d & line );

double momentum2pnt ( CArrRef<Vector2d> point, CArrRef<double> mass, const Line2d & line );

double momentum2sgm ( CArrRef<Segment2d> segm, const Line2d & line );

double momentum2plg ( CArrRef<Vector2d > vert, const Line2d & line );
Следующие функции вычисляют минимальный и максимальный моменты второго порядка для прямых проходящих через центр масс, а также указывают направления этих прямых, которые всегда перпендикулярны. Попутно вычисляется центр масс, если он не был указан:

struct Mom2d
{
    Vector2d minA, maxA; // оси
    double minM, maxM; // моменты 2-го порядка
    Vector2d o; // центр масс
};

Def<Mom2d> momentum2pnt ( CArrRef<Vector2d> point );

Def<Mom2d> momentum2pnt ( CArrRef<Vector2d> point, CArrRef<double> mass );

Def<Mom2d> momentum2sgm ( CArrRef<Segment2d> segm );

Def<Mom2d> momentum2plg ( CArrRef<Vector2d> vert );

Mom2d momentum2plg ( CArrRef<Vector2d> vert, const Vector2d & o );

В отличии от функции centerPlg функции momentum2plg зависят от направления обхода многоугольника.

Функция getEllipse определяет эллипс по моментам 2-го порядка:
Def<Ellipse2d> getEllipse ( const Mom2d & mom );
Функция getRectangle определяет прямоугольник по моментам 2-го порядка:
Def<Rectangle2d> getRectangle ( const Mom2d & mom );

Описание шаблона классов CArrRef находится здесь.
Описание шаблона классов Def находится здесь.
Описание класса Vector2d находится здесь.
Описание классов Segment2d, Line2d, Ellipse2d и Rectangle2d находится здесь.
Исходники алгоритмов находятся в файле moment2d.cpp.

Наверх