Аппроксимация многоугольника


Если многоугольник надо аппроксимировать кругом, то можно построить круг у которого центр масс и площадь будут такие же, как у многоугольника. Если многоугольник надо аппроксимировать эллипсом ( прямоугольником ), то можно воспользоваться моментами 2-го порядка и построить эллипс ( прямоугольник ), у которого центр масс и моменты 2-го порядка будут такие же, как у многоугольника:

Def<Circle2d>    getCirclePlg    ( CArrRef<Vector2d> poly );
Def<Ellipse2d>   getEllipsePlg   ( CArrRef<Vector2d> poly );
Def<Rectangle2d> getRectanglePlg ( CArrRef<Vector2d> poly );

Исходными данными для всех трёх функций является массив вершин многоугольника poly. Направление обхода вершин многоугольника произвольно. В дальнейшем направление обхода должно быть против часовой стрелки.

• Совмещение множества точек (point) и выпуклого многоугольника (vert) при помощи сдвига, без вращения.
Минимизируется максимальное расстояние точек от многоугольника:

Def<Vector2d> minMaxPointsConvexPolygonNR ( CCArrRef<Vector2d> & point, CCArrRef<Vector2d> & vert );

• Совмещение двух выпуклых многоугольников при помощи сдвига первого многоугольника.
Минимизируется сумма максимальных растояний вершин одного многоугольника до другого:

Def<Vector2d> overlayConvexPolygonsNR ( CCArrRef<Vector2d> & vert1, CCArrRef<Vector2d> & vert2 );

• Совмещение множества точек (point) и выпуклого многоугольника (vert) при помощи вращения и сдвига.
Минимизируется максимальное расстояние точек от многоугольника:

Def<Conform2d> minMaxPointsConvexPolygon ( CCArrRef<Vector2d> & point, CCArrRef<Vector2d> & vert );

• Совмещение двух выпуклых многоугольников при помощи поворота и сдвига первого многоугольника:

Def<Conform2d> overlayConvexPolygons ( CCArrRef<Vector2d> & vert1, CCArrRef<Vector2d> & vert2 );

В приложении DEMO можно посмотреть примеры использования этих функций.

Описание классов Circle2d, Ellipse2d и Rectangle2d находится здесь.
Описание шаблона классов CArrRef находится здесь.
Описание шаблона классов Def находится здесь.
Описание класса Conform2d находится здесь.
Описание класса Vector2d находится здесь.

Исходники находятся в approx2d.cpp

Примеры использования всех этих функций можно посмотреть в приложении DEMO.

Наверх