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