Моменты на плоскости можно вычислять относительно точек или прямых.
Моментом 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 находится здесь.
|