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

Моменты на плоскости можно вычислять относительно точек или прямых. Моментом n-ного порядка множества точек называется сумма произведений расстояний до точек в n-й степени на массу точки. Если множество точек непрерывно, то сумма заменяется на интегрирование.

• Моменты четвёртого порядка относительно точки:

double momentum4sgm ( const Segment2d & s, const Vector2d & o );

double momentum4sgm ( CCArrRef<Segment2d> & segm, const Vector2d & o );
• Моменты первого порядка относительно прямой:
double momentum1pnt ( CCArrRef<Vector2d> & point, const Line2d & line );

double momentum1pnt ( CCArrRef<Vector2d> & point, CCArrRef<double> & mass, const Line2d & line );

double momentum1sgm ( CCArrRef<Segment2d> & segm, const Line2d & line );

• Моменты второго порядка относительно прямой:

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

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

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

double momentum2plg ( CCArrRef<Vector2d>  & vert, const Line2d & line );
• Моменты четвёртого порядка относительно прямой:
double momentum4sgm ( const Segment2d & s, const Line2d & line );

double momentum4sgm ( CCArrRef<Segment2d> & segm, const Line2d & line );

Назовём центром масс n-ного порядка точку, относительно которой момент n-ного порядка будет минимальным. Результат не вычисляется в том случае, когда сумма масс равна нулю.

• Центры масс второго порядка:
Def<Vector2d> centerPnt ( CCArrRef<Vector2d> & point );

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

Def<Vector2d> centerSgm ( CCArrRef<Segment2d> & segm );

Def<Vector2d> centerPlg ( CCArrRef<Vector2d>  & vert );
• Центры масс четвёртого порядка:
Def<Vector2d> center4pnt ( СCArrRef<Vector2d> & point );

Def<Vector2d> center4sgm ( СCArrRef<Segment2d> & segm );
Следующие функции вычисляют минимальный и максимальный моменты второго порядка для прямых проходящих через центр масс, а также указывают направления этих прямых, которые всегда перпендикулярны друг другу. Попутно вычисляется центр масс, если он не был указан:
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.

Наверх