Пусть дан набор точек ( point ) и нужно найти его диаметр вдоль заданного направления ( dir ). Функция diameterPnt находит его, а также возвращает индексы самой ближней ( imin ) и самой дальней ( imax ) точкек: typedef unsigned int nat; double diameterPnt ( CCArrRef<Vector2d> & point, const Vector2d & dir, nat & imin, nat & imax ); inline double diameterPnt ( CCArrRef<Vector2d> & point, const Vector2d & dir ) { nat imin, imax; return diameterPnt ( point, dir, imin, imax ); }В случае пустого массива возвращается ноль, а индексы imin и imax не изменяются. Следующие функции находят диаметры у выпуклых многоугольников. Функции maxConvexPolygonDiameter находят максимальный диаметр ( первая из них ещё и индексы наиболее удалённых вершин ): double maxConvexPolygonDiameter ( CCArrRef<Vector2d> & vert, nat & ix1, nat & ix2 ); inline double maxConvexPolygonDiameter ( CCArrRef<Vector2d> & vert ) { nat ix1, ix2; return maxConvexPolygonDiameter ( n, vert, ix1, ix2 ); } Функции minConvexPolygonDiameter находят минимальный диаметр ( первые две из них ещё и направление вдоль которого этот диаметр вычислялся ): double minConvexPolygonDiameter ( CCArrRef<Vector2d> & vert, Vector2d & dir, nat & i1, nat & i2 ); inline double minConvexPolygonDiameter ( CCArrRef<Vector2d> & vert, Vector2d & dir ) { nat i1, i2; return minConvexPolygonDiameter ( vert, dir, i1, i2 ); } inline double minConvexPolygonDiameter ( CCArrRef<Vector2d> & vert ) { nat i1, i2; Vector2d dir; return minConvexPolygonDiameter ( vert, dir, i1, i2 ); }Можно искать минимальный диаметр выпуклого многоугольника вдоль заданного сектора направлений. Сектор задаётся средним направлением dir и половинным углом в градусах angle. Ответ получаем в виде возвращаемого диаметра и минимального направления res: double minConvexPolygonDiameter ( CCArrRef<Vector2d> & vert, Vector2d dir, double angle, Vector2d & res );Аналогично находим максимальный диаметр: double maxConvexPolygonDiameter ( CCArrRef<Vector2d> & vert, Vector2d dir, double angle, Vector2d & res ); Входной параметр для всех этих функций - это ссылка на массив, где расположены вершины многоугольника. Как обычно обход вершин полагается против часовой стрелки. Время работы всех этих фукций зависит линейно от к-ва вершин Известно, что для простого многоугольника можно построить выпуклую оболочку за время O(n) ( смотрите раздел Выпуклая оболочка на плоскости ). Отсюда следует, что диаметры простого многоугольника можно найти за время O(n). Описание класса Vector2d находится здесь.
Исходники алгоритма находятся в файле func2d.cpp. Наверх |